复制类对象
赋值操作和初始化操作都会导致对象被复制。
赋值:在将一个对象的值赋给另一个对象时,第一个对象将复制到第二个对象中。 因此,
Point a, b; ... a = b;
导致 b 的值被复制到 a 中。
初始化:在以下情况下将进行初始化:声明新对象、参数通过值传递给函数或值通过值从函数返回。
您可以为类类型的对象定义“复制”的语义。 例如,考虑此代码:
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
前面的代码可能表示“将 FILE1.DAT 的内容复制到 FILE2.DAT”,也可能表示“忽略 FILE2.DAT 并使 b 成为 FILE1.DAT 的另一个句柄”。您必须将适当的复制语义附加到每个类,如下所示。
通过将赋值运算符 operator= 与对类类型的引用一起用作返回类型和 const 引用所传递的参数(例如,ClassName& operator=(const ClassName& x);)。
通过通过复制构造函数。 有关复制构造函数的详细信息,请参阅声明构造函数的规则。
如果不声明复制构造函数,编译器将为您生成 member-wise 复制构造函数。如果不声明复制赋值运算符,编译器将为您生成 member-wise 复制赋值运算符。 声明复制构造函数不会取消编译器生成的复制赋值运算符,反之亦然。 如果实现上述其中一项,建议您还实现另一项以使代码的含义变得明确。
逐个成员赋值和初始化中更详细地介绍了 member-wise 赋值。
复制构造函数采用 class-name**&** 类型的参数,其中 class-name 是为其定义构造函数的类的名称。 例如:
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
备注
尽可能创建该类型的复制构造函数的参数 const class-name&。这可防止复制构造函数意外更改从中复制它的对象。它还支持从 const 对象进行复制。