复制构造函数的函数名为类的名字,无返回值,和构造函数的区别就在于形参的不同。复制构造函数的形参为同类类型的引用,并且通常限定为const的引用,如Person类的复制构造函数的声明为:
Person(const Person &p); //copy-constructor
复制构造函数在执行对象的复制操作时,涉及到两种类型的复制——浅复制和深复制。浅复制就是将被复制对象的数据成员的值一一的复制给另一个对象,这里应该注意的是复制的是数据成员直接存储的值,而没有复制这个对象关联的一些其它资源。比如:对象有一个指针类型的数据成员,这个指针指向的是另外的一块内存空间,所以这个指针直接存储的值就是那块内存空间的地址,这个时候浅复制就只会复制指针存储的地址值,而不会复制内存空间存储的值。然而,深复制就要求复制相应的资源。
#include <iostream>
using namespace std;
struct Test {
//default-constructor
Test()
:pstr(new string) { }
//copy-constructor
#ifdef COPY
Test(const Test &nn);
#endif
void setVal(string ps);
void getVal(void) const;
private:
string *pstr;
};
#ifdef COPY
Test::Test(const Test &nn)
{
//new operate a new memory space
pstr = new string(*(nn.pstr));
}
#endif
void Test::setVal(string ps)
{
*pstr = ps;
}
void Test::getVal(void) const
{
cout << *pstr << endl;
}
int main(void)
{
Test n1;
n1.setVal("n1-set");
cout << "before creating n2, n1 ->";
n1.getVal();
Test n2 = n1;
n2.setVal("n2-set");
cout << "after creating n2, n1->";
n1.getVal();
cout << "after creating n2, n2->";
n2.getVal();
return 0;
}
上述程序在定义了COPY的时候运行结果为:
before creating n2, n1 ->n1-set
after creating n2, n1 ->
n1-setafter creating n2, n2 ->n2-set
这种结果就是深复制导致的,n1,n2两个对象的数据成成员pstr指向了两个不同的内存空间。
没有定义COPY的时候运行结果为:
before creating n2, n1 ->n1-set
after creating n2, n1 ->
n2-set
after creating n2, n2 ->n2-set
这种结果就是浅复制导致的,n1, n2两个对象的数据成员pstr指向的是同一个内存空间,他们共享同样的数据。
注意:应该避免浅复制,而应该使用深复制。有指针等数据成员的时候,考虑自定复制构造函数进行深复制都是必要的。