一个空的C++类, 编译器会给你做什么?
如果你没有如下函数, 体贴的编译器会为你声明它自己的版本:
一个缺省的构造函数, 一个拷贝构造函数, 一个析构函数, 一个赋值运算符, 一对取址运算符.
例:
class Empty{};
等价于:
class Empty {
public:
Empty(); // 缺省构造函数
Empty(const Empty& rhs); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=(const Empty& rhs); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const;// 取址运算符(const 版本)
};
我们代码中是怎么用的:
const Empty e1; // 缺省构造函数
// 析构函数
Empty e2(e1); // 拷贝构造函数
e2 = e1; // 赋值运算符
Empty *pe2 = &e2; // 取址运算符 (非const)
const Empty *pe1 = &e1; // 取址运算符 (const)
C++编译器对这些函数的实现:
inline Empty::Empty() {} // 缺省构造函数
inline Empty::~Empty() {} // 析构函数
inline Empty * Empty::operator&() { return this; } // 取址运算符 (非const)
inline const Empty * Empty::operator&() const { return this; } // 取址运算符 (const)
至于拷贝构造函数和赋值运算符, 官方的标准是:
对类的非静态数据成员进行以"以成员为单位"逐一拷贝构造(赋值).
如:m是类C中的一个类型为T的非静态成员变量, 若C没有声明拷贝构造函数(赋值运算符),
m将会通过T的拷贝构造函数(赋值运算符)被拷贝构造(赋值)----------------T有拷贝构造函数;
规则递归应用到m的数据成员, 直到找到一个拷贝构造函数(赋值运算符)或固定类型(例如: int, double, 指针, 等)为止.
固定类型的对象拷贝构造(赋值)时是从源对象到目标对象的 "逐位" 拷贝。