C++语言程序设计

实际上，我们希望对象C也被复制，得到C的对象副本D。否则，当对象A和B销毁时，会对对象C的内存区重复释放，而导致错误。为了使对象C也被复制，就必须显式定义复制构造函数。下面我们以string类为例说明，如何定义这个复制构造函数。

| 例10-11

class String
{
public:
String(); //构造函数
String(const String &s); //复制构造函数
~String(); //析构函数

// 接口函数
void set(char const *data);
char const *get(void);

private:
char *str; //数据成员ptr指向分配的字符串
};

String ::String(const String &s)
{
str = new char[strlen(s.str) + 1];
strcpy(str, s.str);
}

我们也常用无名对象初始化另一个对象，例如：
Point pt = Point(10, 20);
类名直接调用构造函数就生成了一个无名对象，上式用左边的无名对象初始化右边的pt对象。
构造函数被调用通常发生在以下三种情况，第一种情况就是我们上面看到的：用一个对象初始化另一个对象时；第二种情况是当对象作函数参数，实参传给形参时；第三种情况是程序运行过程中创建其它临时对象时。下面我们再举一个例子，就第二种情况和第三种情况进行说明：
Point foo(Point pt)
{
…
return　pt;
}
void main()
{
Point pt1 = Point(10, 20);
Point pt2;
…
pt2=foo(pt);
…
}
在main函数中调用foo函数时，实参pt传给形参pt，将实参pt复制给形参pt，要调用复制构造函数，当函数foo返回时，要创建一个pt的临时对象，此时也要调用复制构造函数。