什么是浅拷贝?
浅拷贝 (Shallow Copy) 拷贝一个指向对象的指针,而不是直接复制该对象,即新旧对象指向同一片地址空间。
如图,指针1指向一个car类,而指针2则复制了指针1 ,因此两个指针指向同一个地址空间也就是一个car类的地址。相应的,该car类的任何变化都会同步到指向它的指针,因此指针2指向的内容会随着指针1指向的内容改变而做出相同的改变。
代码如下:
#include <iostream>
using namespace std;
class car
{
public:
int cost;
string name;
car(int cost_val,string name_val):cost(cost_val),name(name_val){}
void show_car()
{
cout << "car cost:" << cost << " " << "car name" << name << endl;
}
};
int main(void)
{
car *p1 = new car(50,"奔驰");
car *p2 = p1;
cout << "p1->cost:" << p1->cost << endl;
cout << "p2->cost:" << p2->cost << endl;
p1->cost = 30;
cout << "p1->coat = 50" << endl;
cout << "p1->cost:" << p1->cost << endl;
cout << "p2->cost:" << p2->cost << endl;
delete p1;
return 0;
}
p1->cost:50
p2->cost:50
p1->coat = 50
p1->cost:30
p2->cost:30
p1指向的成员变量首先初始化为cost=50,这时打印p1、p2的内容都是50。通过指针p1改变成员变量的cost的值,再对p1、p2的内容进行打印时,两者都改变为相同的值。这是因为p2指向了与p1相同的地址空间,两者的内容时相同的。
注意:函数末尾要释放空间时,只需delete一次便可。否则两次释放同一片空间会造成段错误。
什么是深拷贝?
深拷贝 (Deep Copy) 在拷贝的过程中会另外创造一个一模一样的对象.。新对象跟原对象不共享内存, 修改新对象不会改到原对象。
深拷贝的对象另外开辟了一片空间,用来存放拷贝对象的属性变量。在这之后,两者便不再关联。任何一方的变化都不会对对方造成影响,因为他们各自都有着自己的内存空间。
代码:
#include <iostream>
using namespace std;
class car
{
public:
int cost;
string name;
car(int cost_val,string name_val):cost(cost_val),name(name_val){}
void show_car()
{
cout << "car cost:" << cost << " " << "car name:" << name << endl;
}
};
int main(void)
{
car c1(50,"奔驰");
car c2 = c1;
c1.show_car();
c2.show_car();
c1.cost = 30;
cout << "c1.cost = 30" << endl;
c1.show_car();
c2.show_car();
return 0;
}
结果:
car cost:50 car name:奔驰
car cost:50 car name:奔驰
c1.cost = 30
car cost:30 car name:奔驰
car cost:50 car name:奔驰
如上所示,一开始c1被赋值给c2,两者拥有相同的属性变量。在c1改变其cost的值以后,再次打印两者的属性值,c1.cost已然改变而c2没有变化。因为两者有着各自的地址空间,变量发生变化互不影响。