- 编译器可以暗自为 class 创建 defaut 构造函数、copy 构造函数、 copy assignment 操作符,以及析构函数
写下一个 empty class,如果你自己没声明,编译器就会为它声明(编译器版本的)一个 copy 构造函数、一个 copy assignment 操作符和一个析构函数。如果你也没有声明任何构造函数,编译器也会为你声明一个 default 构造函数。所有这些函数都是 public 且 inline 的。
你写下:
class Empty {};
就好像你写下:
class Empty {
public:
Empty(){...} // default构造函数
Empty(const Empty& rhs) {...} // copy构造函数
Empty& operator=(const Empty& rhs) {...} // copy assignment 操作符
~Empty() {...} // 析构函数
};
惟有当这些函数被需要(被调用),它们才会被编译器创建出来。
编译器为你写函数:
default 构造函数和析构函数:给编译器一个地方用来放置“藏身幕后”的代码
,比如调用 base classes 和 non- static 成员变量的构造函数和析构函数(编译器产出的析构函数是个 non- virtual,除非这个 class 的 base class 自身声明有 virtual 析构函数)- copy 构造函数和 copy assignment 操作符:编译器创建的版本只是单纯地将来源对象的每一个 non- static 成员变量拷贝到目标对象(对于内含 reference 成员或 const 成员的 classes,编译器会拒绝为它们生成 copy assignment 操作符;如果某个 base classes 将 copy assignment操作符声明为 private,编译器将拒绝为其 derived classes 生成 copy assignment 操作符)