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

设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值