C++ 浅拷贝与深拷贝

什么是浅拷贝?

浅拷贝 (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没有变化。因为两者有着各自的地址空间,变量发生变化互不影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值