cpp 11&14 type Alias,nonexcep和override

  • Type ALias (与typedef 相似)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //**************************//
    //type alias,identical to
    //typedef void(*func)(int,int);
    using func=void(*)(int,int);
    //func 表示一个入参为(int,int)类型的函数指针
    void example(int,int){}
    func fn=example;
    typdef basic_string<char> string;

    //**************************//
    //局部的typedef
    template<typename T>
    struct Container{
    using value_type=T;//typedef T value_type
    }
    //并且可以应用到原编程,如果上述定义了value_type
    template<typename Cntr>
    void fn2(const Cntr& c){
    typename Cntr::value_type n;
    }

    //**************************//
    //用于隐藏模板参数
    template<class CharT> using mystring=std::basic_string<CharT,std::char_traits<Chart>>
    mystring<char> str;
  • nonexcep
    1
    2
    void foo()noexcep;
    //void foo()noexcept(true); 表示不会抛出异常

Type ALias

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//**************************//
//type alias,identical to
//typedef void(*func)(int,int);
using func=void(*)(int,int);
//func 表示一个入参为(int,int)类型的函数指针
void example(int,int){}
func fn=example;
typdef basic_string<char> string;

//**************************//
//局部的typedef
template<typename T>
struct Container{
using value_type=T;//typedef T value_type
}
//并且可以应用到原编程,如果上述定义了value_type
template<typename Cntr>
void fn2(const Cntr& c){
typename Cntr::value_type n;
}

//**************************//
//用于隐藏模板参数
template<class CharT> using mystring=std::basic_string<CharT,std::char_traits<Chart>>
mystring<char> str;

using 用法总结

  • using-directives
    1
    2
    3
    using namespace std;
    //单独打开某个函数
    using std::cout;
  • using-declareations
    1
    2
    // 制定函数类型是某个命名空间下的类型
    using _Base::_M_allocate
  • type alias
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //type alias and alias template
    using func=void(*)(int,int);

    template<typename T>
    struct Container{
    using value_type=T;//typedef T value_type
    }

    template<class CharT> using mystring=std::basic_string<CharT,std::char_traits<Chart>>

noexcept

表示函数不抛出异常
当异常都没有被捕获时,会调用std::terminate()中的std::abort()方法

code

1
2
3
4
//表示x.swap(y)不抛异常就不会抛出异常
void swap(Type& x,Type& y) noexcept(nonexcept(x.swap(y))){
x.swap(y);
}

注意点

当使用growable container(会发生 memory reallocation)之后两种

  • vector
  • deque
    如果类定义了移动构造,并且希望被grow 类型的容器调用需要在移动构造时使用noexcept
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Mystring{
    private:
    char* _data;
    size_t _len;
    public:
    Mystring(Mystring&& str)noexcept:
    :_data(str._data),_len(str.len){}

    Mystring& operator=(MyString&& str)noexcept{
    return *this;
    }
    }

override

用于让编译器帮忙检验当前函数是否是复写父类函数

code

1
2
3
4
5
6
7
8
9
10
11
12

struct Base{
virtual void vfunc(float){}
};
struct Dervied1:Base{
virtual void vfunc(int){}//本来想override,但是写错了
}
//改进

struct Dervied1:Base{
virtual void vfunc(int)override{}//没有相同的函数,写错了报错
}

final

不允许复写

code

1
2
struct Base1 final{}
struct Derived1:Base1{}; //报错,不可以被继承

方法

1
2
3
4
5
6
7
struct Base2{
virtual void f() final;
}

struct Derived2:Base2{
void f();// 报错,不可以被复写
}