如果你写下
class Empty {};
就如同写下
class Empty {
public:
Empty(){} // default 构造函数
Empty(const Empty & rhs) {} // copy构造函数
~Empty() {} // 析构函数, 是否该是 virtual 见稍后说明
Empty & operator= (const Empty & rhs) {} // copy assignment操作符
};
也就是说,
Empty e1; // default 构造函数
// 析构函数
Empty e2(e1); // copy assignment 操作符
e2 = e1; // copy assignment 操作符
至于copy构造函数和copy assignment操作符, 编译器创建的版本只是单纯地将来源对象的每一个non-static 成员变量拷贝到目标对象。 考虑一个NameObject template, 它允许你将一个个名称和类型为T的对象产生关联:
template<typename T>
class NameObject {
public:
NameObject(const char * name, const T & value);
NameObject(const std::string & name, const T & value);
private:
std::string nameValue;
T objectValue;
};
由于已经声明了一个构造函数, 编译器于是不再为它创建default构造函数。 如果NameObject既没有声明copy构造函数, 也没有声明copy assignment操作符, 所以编译器会为它创建那些函数。
NameObject<int>no1("Smallest Prime Number", 2);
NameObject<int>no2(no1); // 调用copy构造函数
总结
编译器可以为class 创建 default构造函数、copy 构造函数、copy assignment操作符, 以及析构函数。