Rule-of-Three
Three 為何物?
所谓的 Three 其实就是 copy constrcutor (拷贝构造函数) 、copy assignment operator (拷贝赋值操作符) 和 destructor (析构函数) 。 在介绍 Rule-of-Three 之前,我们回顾一下 C++ Class 的声明与定义。
class Empty
{
private:
int _val {
0 };
};
class Empty
十分简单,我没有为它赋予任何 data members (数据成员) 或显式地声明/定义 member functions (成员函数) 。但事实上,在必要时编译器为 class Empty
合成必要的成员函数。此话何解?我们不妨来看一下示例。
int main()
{
Empty e1 {
}; // 创建一个Empty对象
Empty e2 {
e1 }; // 通过一个已有的Empty对象给另外一个Empty对象初始化
Empty e3;
e3 = e2; // 通过一个已有的Empty对象给另外一个Empty对象初始化
}
当我们需要创造 Empty e1
这个对象的时候,届时我们没有为 class Empty
显式地编写构造函数函数。编译器自然会为我们补充如下的一个 default constructor (默认构造函数) 。 注意:我只是在模仿编译器的行为,并不代表编译器的具体做法必须跟我的做法一样。
// C++ 概念代码
Empty::Empty()
{
// 啥也不干
}
当我们需要通过 Empty e1
去构造更多的相同类型对象的时候,编译器又帮我们做了以下的事情。编译器会为 class Empty
添加拷贝构造函数 Empty::Empty(const Empty&)
和拷贝赋值操作符 Empty& operator=(const Empty& other)
。
事实上就 class Empty
的结构而言,编译器根本不需要生成拷贝构造函数和拷贝赋值操作符。因为 class Empty
的数据成员里根本没有 class object (类对象)。编译器只需要通过 bitwise copy (位逐次拷贝) 把对象的内存逐一拷贝就能完成任务,简化了拷贝流程。为了更好地演示 Three ,我就假设编译器会自动生成所需要的函数。
注意:我只是在模仿编译器的行为,并不代表编译器的具体做法必须跟我的做法一样。
// C++ 概