浅拷贝与深拷贝的主要区别:
浅拷贝与深拷贝的主要区别在于类中有在堆区开辟空间时。
浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝:会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
注意:在要开辟空间时必须要用深拷贝
浅拷贝
#include <iostream>
using namespace std;
class Base1
{
private:
int a;
int *b;
public:
Base1()
{
a = 0;
b = new int(0);
}
Base1(int a1,int b1)
{
a = a1;
b = new int(b1);
}
Base1(const Base1 &base1)//拷贝函数
{
this->a = base1.a;
this->b = base1.b;
}
~Base1()//析构函数
{
delete b;
b = NULL;
}
int *getP()//获取b的地址
{
return b;
}
};
int main(int argc, char *argv[])
{
Base1 A(1,10);
Base1 B(A);//把A拷贝给B
cout << "A中b的地址:" <<A.getP()<<endl;
cout << "B中b的地址:" <<B.getP()<<endl;
return 0;
}
注意:
①C++默认拷贝构造是浅拷贝
②由于直接复制的地址所以两个对象中的b的地址都一样
③由于浅拷贝不会开辟新的空间,而在析构时会析构两次(分别是A、B),所以会导致空间的重复释放
深拷贝
#include <iostream>
using namespace std;
class Base2
{
private:
int a;
int *b;
public:
Base2()
{
a = 0;
b = new int(0);
}
Base2(int a1,int b1)
{
a = a1;
b = new int(b1);
}
Base2(const Base2 &base2)//拷贝函数
{
this->a = base2.a;
this->b = new int(*(base2.b));
}
~Base2()
{
delete b;
b = NULL;
}
int *getP()
{
return b;
}
};
int main(int argc, char *argv[])
{
Base2 A(1,10);
Base2 B(A);
cout << "A中b的地址:" <<A.getP()<<endl;
cout << "B中b的地址:" <<B.getP()<<endl;
return 0;
}
结果