Keithee Explorer
本章学习如何控制类类型对象在拷贝、赋值、移动和销毁时应该做什么。 一个类定义五种特殊的成员函数来控制对象的拷贝、移动、赋值和销毁操作。他们分别是拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值函数和析构函数。 拷贝、赋值与销毁 拷贝构造函数 如果构造函数的第一个参数是自身对象的引用,而且其他额外参数都有默认值,则该构造函数是拷贝构造函数。 12345 class {public: Foo(); Foo(const Foo&);} 拷贝构造函数会在几种情况下被隐式地使用,所以不应该是 explicit 。 合成拷贝构造函数 如果我们没有定义一个拷贝构造函数,则编译器会为我们定义一个。编译器将类内的每个非 static 成员拷贝到正在创建的对象中。对于类类型的成员,则使用其拷贝构造函数来拷贝。 123456789 class Sales_data{public: Sales_data(const Sales_data&);private: string bookNo; int units_sold; double revenue;} 现在我们可以理解直接初始化和拷贝初始化的真正区别了,也就是说直接初始化是一个构造函数参数匹配的过程,而拷贝初始化要求我们将右侧的运算对象拷贝到左侧的对象中去,有时候还要求类型转换。 拷贝初始化不仅发生在使用 = 运算符时,还发生在以下情况: