C++11&14新标准—— =delete、=default

2023-12-13 17:44:05

系列文章目录

C++11&14新标准——Variadic templates(数量不定的模板参数)
C++11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit
C++11&14新标准—— =delete、=default



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,使得只有友元函数和该类的成员可以调用。

文章来源:https://blog.csdn.net/weixin_48956191/article/details/134972120
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。