@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
@我的网站: https://www.cppbug.com
条款05-了解C++默默编写并调用哪些函数
当我们写了一个空类,意味着什么
当我们定义一个空类时,编译器会为我们自动声明拷贝构造函数、拷贝赋值运算符和析构函数,若你没有声明任何构造函数,编译器会声明一个默认构造函数,这些函数都是 public 且 inline。
例如我们定义一个空类:class Empty { };,等同于下面这段代码:
class Empty {
public:
Empty() { ... };
Empty(cosnt Empty& rhs) { ... }
~Empty() { ... }
Empty& operator=(const Empty& rhs) { ... }
}
注意:
- 编译器合成的析构函数是
non-virtual的。 - 对于拷贝构造函数和拷贝赋值运算符,编译器合成的版本只是单纯的将对象每个
non-static成员拷贝到目标对象。
编译器什么时候拒绝生成拷贝赋值运算符
- 类的成员变量是 引用 类型时。因为C++不允许改变引用的对象。
- 类的成员变量是
const类型时。因为C+++不允许修改常量。 - 基类的拷贝赋值运算符声明为 删除的(C++11) 或者 private 的,那么编译器拒绝为它的派生类生成拷贝赋值运算符。因为 若生成了拷贝赋值运算符,派生类的拷贝赋值运算符同时也会处理基类部分的成员变量,而基类没有该函数,所以没办法赋值。
总结
- 编译器会暗自为类声明拷贝构造函数、拷贝赋值运算符、析构函数、默认构造函数。
本文探讨C++中编译器自动为类生成的默认函数,包括拷贝构造函数、拷贝赋值运算符、析构函数及默认构造函数。详解编译器拒绝生成拷贝赋值运算符的情况,如成员变量为引用或const类型,或基类拷贝赋值运算符被声明为删除或private。
495

被折叠的 条评论
为什么被折叠?



