编程学习biancheng.45soft.com 本站提供了各种在线教程和资料,供大家学习与参考.
编程学习
当前位置: 主页 > C++ > 复制控制 > C++ 复制控制 定义自己的复制构造函数

C++ 复制控制 定义自己的复制构造函数

复制构造函数就是接受单个类类型引用形参(通常用 const 修饰)的构造函数:

class Foo
{
public:
    Foo();           // default constructor
    Foo(const Foo&); // copy constructor
    // ...
};

虽然也可以定义接受非 const 引用的复制构造函数,但形参通常是一个 const 引用。因为用于向函数传递对象和从函数返回对象,该构造函数一般不应设置为 explicit(第 12.4.4 节)。复制构造函数应将实参的成员复制到正在构造的对象。


对许多类而言,合成复制构造函数只完成必要的工作。只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义复制构造函数,也可以复制。


然而,有些类必须对复制对象时发生的事情加以控制。这样的类经常有一个数据成员是指针,或者有成员表示在构造函数中分配的其他资源。而另一些类在创建新对象时必须做一些特定工作。这两种情况下,都必须定义复制构造函数。


通常,定义复制构造函数最困难的部分在于认识到需要复制构造函数。只要能认识到需要复制构造函数,定义构造函数一般非常简单。复制构造函数的定义与其他构造函数一样:它与类同名,没有返回值,可以(而且应该)使用构造函数初始化列表初始化新创建对象的成员,可以在函数体中做任何其他必要工作。


后续章节中将给出一些需要定义复制构造函数的类的例子。第 13.4 节给出了一对类,它们需要显式复制构造函数,用于处理与简单消息处理应用程序相关的工作。具有指针成员的类在第 13.5 节给出。



13.1.2 练习题

对于如下的类的简单定义,编写一个复制构造函数复制所有成员。复制 pstring 指向的对象而不是复制指针。

struct NoName
{
   NoName(): pstring(new std::string), i(0), d(0) { }
private:
   std::string *pstring;
   int    i;
   double d;
};

哪个类定义可能需要一个复制构造函数?

包含四个 float 成员的 Point3w 类。

Matrix 类,其中,实际矩阵在构造函数中动态分配,在析构函数中删除。

Payroll 类,在这个类中为每个对象提供唯一 ID。

Word 类,包含一个 string 和一个以行列位置对为元素的 vector。

复制构造函数的形参并不限制为 const,但必须是一个引用。解释这个限制的基本原理,例如,解释为什么下面的定义不能工作。

Sales_item::Sales_item(const Sales_item rhs);



编程学习 C++ 复制控制 定义自己的复制构造函数 转载请保留此行.谢谢.

C++