系列文章目录
C++11&14新标准——Variadic templates(数量不定的模板参数)
C++11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit
C++11&14新标准—— =delete、=default
文章目录
- 系列文章目录
- 1. =default
- 2. delete
1. =default
default是C++11提出的新关键字,效果为获得一个系统默认的构造函数(内容为空),只能用在五大成员函数上,如果用在其他函数上,编译器会报错。
class Zoo{
public:Zoo()=default; //默认构造函数Zoo(const Zoo&)=default; //拷贝构造函数Zoo(const Zoo&&)=default; //移动构造函数Zoo& operator=(const Zoo&)=default; //移动构造函数Zoo& operator=(const Zoo&&)=default; //移动构造赋值重载
private:int d1;int d2;
}
对于构造函数来说,可以同时存在自定义构造函数和default构造函数,因为构造函数本来就可以有很多个;但对于剩下的四个函数来说,当有了自定义构造函数的时候,就不能再使用default,否则编译器将报错。
class Zoo{
public:Zoo(int l1, int l2):d1(l1),d2(l2){};Zoo()=default; //正确Zoo(const Zoo& x):d1(x.d1),d2(x.d2){};Zoo(const Zoo&)=default; // 报错!Zoo& operator=(const Zoo&){d1 = x.d1;d2 = x.d2;return *this;}; //移动构造函数Zoo& operator=(const Zoo&)=default;// 报错!private:int d1;int d2;
}
技巧:如果一个类里面的成员包含指针对象,那么绝大部分都要自己定义构造函数,不能使用default;相反如果成员不包含指针,那么基本上都可以使用default构造函数;
2. delete
delete的效果为该函数禁止使用,可以用在五大成员函数之外的其他函数上。
class Zoo{
public:Zoo()=delete; //禁止默认构造函数Zoo(const Zoo&)=delete; //禁止拷贝构造函数Zoo(const Zoo&&)=delete; //禁止移动构造函数Zoo& operator=(const Zoo&)=delete; //禁止移动构造函数Zoo& operator=(const Zoo&&)=delete; //禁止移动构造赋值重载
private:int d1;int d2;
}
可以将特定参数的构造函数delete,用于阻止该类初始化;也可以将所有的构造函数全部delete,这样使得该类成为一个静态类,无法实例化。
将拷贝构造函数delete,会使得该类成为一个单例。也可以通过将拷贝构造函数定义为private,使得只有友元函数和该类的成员可以调用。