类-自动合成的函数

1.类可以自动合成哪些函数?
总共有六类:
1)默认构造函数(constructor),
2)拷贝构造函数(copy constructor),
3)拷贝赋值函数(copy assignment),  
4)析构函数(destructor),   
5)移动构造函数(move constructor), 
6)移动赋值函数(move assignment).


构造:直接分配内存并初始化创建一个对象
赋值:改变已存在的对象的数据成员
移动:将对象A的数据移动到另个对象B中,被移动后对象A依然存在,可以进行赋值或移动,但不能够被使用(未定义行为)
析构:销毁已存在的对象,收回分配的内存
class Foo {
public:
	//使用default显示地合成构造函数
	Foo() = default;					    //构造函数


	Foo(const Foo &) = default;		        //拷贝构造,参数为const引用
	Foo(Foo &&)      = default;			    //移动构造,参数为非常量的右值	


	Foo& operator=(const Foo &) = default;  //拷贝赋值,参数为const引用,返回引用类型  
	Foo& operator=(Foo &&) = default; 		//移动赋值,参数为非常量的右值,返回引用类型   


	~Foo()=default;
};

2.类进行自动合成的条件?
  当一个类中没有定义任何自己版本的拷贝控制成员,且类的每个非static数据成员都
  可以拷贝控制成员(构造函数必须为默认构造函数)时,编译器才会为它合成对应的拷贝控制成员。
  
3.哪些情况下类会被定义成删除的?
  本质上,如果一个类有数据成员不能默认构造,拷贝,赋值,销毁,这些成员对应的拷贝控制成员被定义为删除的。
 具体举例与特例:
  1.类成员未定自己的拷贝控制成员或编译器无法自动合成(适用6个函数)
  2.类成员的拷贝控制成员是删除的或不可访问的(适用6个函数)
  2.定义非默认的构造函数(使用构造函数)
  3.定义了copy构造或/和赋值,但未定义move构造和赋值(适用move构造和赋值)
  4.定义了move构造或/和赋值,但未定义copy构造和赋值 (适用copy构造和赋值)
  5.类有引用成员没有类内初始化器,或const成员没有类内初始化器且其类型为显示定义默认构造函数(适用默认构造函数)
 struct NoC{
	 int   i  = 0
	 const int ci = 0;   //
	 int&  ri = &i;      //带初始值,可以默认构造
 }
  6.类内有引用或const成员(使用move赋值)
  7.类内析构函数是删除的(使用构造函数)
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值