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.类内析构函数是删除的(使用构造函数)