浅拷贝
其实浅拷贝就是简单的赋值拷贝,即a = b,使用默认的拷贝函数和析构函数。这样在释放时才不会出错。
class X
{
public:
X(int _data) : data(_data)
{}
private:
int data;
};
int main()
{
X a(5), b = a; //把a的值赋给b,执行默认拷贝函数
}
深拷贝
深拷贝是在构造函数时开辟了一个空间用来存储a的值,如果这时进行a = b拷贝操作,只会将a的地址复制b,a和b同时指向该空间,执行析构函数时就会释放同一空间(内存)两次,而导致出错。所有需要自己写一个拷贝函数,并在函数里开辟一个新的空间来放b拷贝后的值。这样就会在执行析构函数时释放各自空间(内存)。
class X
{
public:
X(){};//无参构造
X(int _size) : size(_size)
{
data = new int[size];
} // 为a分配内存
X(const X &_X) : size(_X.size) //拷贝构造
{
data = new int[size];
} // 深拷贝 为拷贝的b分配内存
~X()//析构函数
{
delete [] data;
} // 析构时释放a,b资源
private:
int* data;
int size;
};
int main()
{
X a(5), b = a;
}