用一个类对象初始化该类的另一个对象被称为缺省按成员初始化,在概念上的过程是通过依次拷贝每个非静态数据成员。也被成为浅拷贝。
浅拷贝存在的一个显著问题就是,如果类中包含指针成员,在构造函数中申请了堆、文件等资源,会造成新对象和原来对象的指针指向同一处资源,很容易导致程序崩溃,并且常常出现我们意料之外的计算结果。
解决办法就是使用深拷贝方式,即给类编写拷贝构造函数。拷贝构造函数有一个指向类对象的引用作为形式参数(一般情况下是const引用),并且在函数实现中为新对象申请相同资源。如下所示:
class A
{
public:
A(){};
A(int _size) : size(_size)
{
data = new int[size];
}
A(const A& _A) : size(_A.size)
{
data = new int[size];
}
~A()
{
delete [] data;
}
private:
int* data;
int size;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a(5), b = a;
return 0;
}