- =default,代表使用编译器合成的函数,只有两类函数式编译器合成的。一是构造函数,二是拷贝函数。其中拷贝函数包括:拷贝构造函数,拷贝赋值重载符,析构函数。因为如果类自己实现了某个构造函数,那么编译器就不会为其合成构造函数,只有手动加上=default才行,比如:
class A{
public:
A(int a):a(a){}
A(const A&)=default;
A& operator=(const A&);
private:
int a;
};
此时就无法通过A a();
来创建A对象,因为编译器不会为其合成构造函数。采用下面的方法将可以完成。
class A{
public:
A()=default;
A(int a):a(a){}
A(const A&)=default;
A& operator=(const A&);
private:
int a;
};
A& A::operator=(const A&)=default;//需要在类的外部再声明一次。
在上面的例子中,在类内用=default修饰的合成成员函数都是内联的,而在类外用=default修饰的合成成员函数不是内联的。
2.override
用于在派生类重新覆盖基类的虚函数时,如果在非虚函数后加上override将会报错。
3.final
在派生类覆盖的虚函数后面加上final将导致该派生类的派生类无法再去覆盖该虚函数了。
4.=delete
比如不想让某些可合成的成员函数被用户访问,以前的做法是将该函数定义为private的,比如默认拷贝构造函数。现在的做法只需要在该函数后面加上=delete,比如:
class A{
public:
A()=default;
A(int a):a(a){}
A(const A&)=delete;
A& operator=(const A&);
private:
int a;
};
但是析构函数不能加上=delete,如果析构函数被删除了就无法销毁此类型的对象了。