目录
Type Alias的应用类似与typedef
例1
typedef void(*func)(int,int)与using func = void (*)(int,int)使用方法是一样的,但是typedef void(*func)(int,int)不能突显出func是一个函数指针,是函数的类型。而using func = void (*)(int,int)就可以突显出func是一个函数指针。func就可以当成一种类型,创建一个函数指针对象fn,接收example函数指针的赋值。
例2
using value_type = T,相当于typedef T value_type;
例3:Alias template 给模板起别名
如图所示mystring只是较长模板的一个别名,使用起开更加整洁。
其中例1和例2中的type alias类型别名的声明和typedef声明的作用是一模一样的,在使用type alias类型别名时,显得类型更加突出。类型别名的声明是通过using来实现的,另外using可以用来打开标准库,例如using namespace std和using std::count,using也可以为class引入其他class成员,如下图所示。
- void foo() noexcept
- void foo() noexcept(true)
上述两行代码的第一行,保证foo这个函数不会抛出异常,第二行的意思是,noexcept后括号里面为true才可以保证不抛出异常。
上图swap函数不抛出异常,是在大的红色方框里为true,也就是小的红色方框里不要抛出异常,小的红色方框不抛出异常,就需要保证小的红色方框里的x.swap(y)为true.
如上图所示,在我们实现的类里面涉及到移动语义的时候要使用noexcept,保证不抛出异常,否则别人在用这个类的时候担心会抛出异常。
override应用在虚函数上,例如父类定义的虚函数
virtual void vfunc(float){}
我们在子类中进行改写时,写出如下所示的形式,下面所写是错误的,括号里面是float才叫重写,而这个错误一旦写出来我们就很难发现,除非在编译后才会察觉。我们在下述virtual void vfunc(int){}写成virtual void vfunc(int) override {},在编写程序的时候编译器会提示出int类型参数是错误的
virtual void vfunc(int){}
我们在类的后面添加final关键字,将会导致这个类不可被继承。如下所示,Base1将不可被子类继承;
struct Bas1 final{};
我们在类的成员函数的后面添加final关键字,将会导致这个类不可被改写。如下所示,Base2的f()函数将不可被子类改写;
- struct Base2{
- virtual void f() final;
- }
-
- struct Derived:Base2{
- void f();//这里会被提示错误
- }