C++ 默认构造函数与拷贝控制成员 =default =delete

1. 合成默认构造与拷贝控制成员

C++ Primer P440
C++ 默认构造函数与拷贝控制成员 =default =delete_第1张图片

1.1 合成默认构造函数

C++ Primer P236

C++ 默认构造函数与拷贝控制成员 =default =delete_第2张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第3张图片

只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。

1.2 合成的拷贝构造函数

C++ Primer P440
C++ 默认构造函数与拷贝控制成员 =default =delete_第4张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第5张图片

如果我们没有为一个类定义拷贝构造函数,编译器会为我们定义一个。与合成默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数。

1.3 合成的拷贝赋值运算符

C++ Primer P444
C++ 默认构造函数与拷贝控制成员 =default =delete_第6张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第7张图片

与处理拷贝构造函数一样,如果一个类未定义自己的拷贝赋值运算符,编译器会为它生成一个合成拷贝赋值运算符。

1.4 合成析构函数

C++ Primer P446
C++ 默认构造函数与拷贝控制成员 =default =delete_第8张图片

当一个类未定义自己的析构函数时,编译器会为它定义一个合成析构函数。

2. =default 与 =delete

C++ Primer P449
C++ 默认构造函数与拷贝控制成员 =default =delete_第9张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第10张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第11张图片

3. 合成的拷贝控制成员可能是删除的

C++ Primer P450

C++ 默认构造函数与拷贝控制成员 =default =delete_第12张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第13张图片

1.如果类的某个成员的拷贝构造函数是删除的或不可访问的,则类的合成拷贝构造函数被定义为删除的。
2.虽然我们显式地要求编译器生成一个Derived1类的合成的拷贝构造函数,但是Derived1类的成员 Base b 的拷贝构造函数是删除的函数(Base(const Base&) = delete;),所以Derived1类的合成拷贝构造函数是删除的函数。

C++ 默认构造函数与拷贝控制成员 =default =delete_第14张图片

注意,当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。当拷贝构造函数被定义为删除的函数时,编译器并不会生成默认构造函数。

C++ 默认构造函数与拷贝控制成员 =default =delete_第15张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第16张图片

如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有一个const的或引用成员,则类的合成拷贝赋值运算符被定义为删除的。即使我们显式地要求编译器生成一个合成拷贝赋值运算符也是如此。

C++ 默认构造函数与拷贝控制成员 =default =delete_第17张图片

如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个引用成员,它没有类内初始化器,或是类有一个const成员,它没有类内初始化器且其类型未显式定义默认构造函数,则该类的默认构造函数被定义为删除的。即使我们没有定义任何构造函数也是如此。

4. 合成的移动操作

C++ Primer P475
C++ 默认构造函数与拷贝控制成员 =default =delete_第18张图片


C++ 默认构造函数与拷贝控制成员 =default =delete_第19张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第20张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第21张图片

C++ 默认构造函数与拷贝控制成员 =default =delete_第22张图片

1.只有当一个类没有定义任何自己版本的拷贝控制成员,且它的所有数据成员都能移动构造或移动赋值时,编译器才会为它合成移动构造函数或移动赋值运算符。定义拷贝控制成员为合成版本(=default)也是属于自定义了拷贝控制成员。
2.如果一个类没有移动操作,通过正常的函数匹配,类会使用对应的拷贝操作来代替移动操作。

C++ 默认构造函数与拷贝控制成员 =default =delete_第23张图片
C++ 默认构造函数与拷贝控制成员 =default =delete_第24张图片

1.如果一个类有一个可用的拷贝构造函数而没有移动构造函数,则其对象是通过拷贝构造函数来“移动”的。拷贝赋值运算符和移动赋值运算符的情况类似。
2.如果类定义了一个移动构造函数和/或一个移动赋值运算符,则该类的合成拷贝构造函数和拷贝赋值运算符会被定义为删除的。

5. 合成拷贝控制与继承

C++ Primer P553
C++ 默认构造函数与拷贝控制成员 =default =delete_第25张图片

你可能感兴趣的:(c++)