细说深浅拷贝

先说明他的应用:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

首先说明下深浅拷贝

浅拷贝:简单的赋值拷贝操作,执行的是编译软件自己带的默认拷贝

(会带来堆区的内存被重复释放的问题,导致程序崩掉,用深拷贝可以解决此类问题)

深拷贝:根据以下代码自行理解

#include<iostream>
using namespace std;

/*
深浅拷贝 
浅拷贝:简单的赋值拷贝操作		,带来的问题是堆区的内存重复释放(程序会报错,解决办法是运用深拷贝)
深拷贝:
*/
class person
{
public:
	person()
	{
		cout << "person默认构造" << endl;
	}
	person(int age, int height)
	{
		m_age = age;
		m_height = new int(height);
		cout << "person有参构造" << endl;
	}

	//自己实现拷贝构造函数,解决浅拷贝带来的问题
	person(const person& p)
	{
		cout << "person 拷贝构造函数调用" << endl;
		m_age = p.m_age;
		//m_height = p.m_height;			编译器默认实现的就是这行代码
	
		//深拷贝操作

		m_height = new int(*p.m_height);
	}


	~person()
	{
		//析构代码,将堆区开辟数据做释放操作
		if (m_height != NULL)
		{
			delete m_height;
			m_height = NULL;
		}
		cout << "person析构函数" << endl;
	}
	int m_age;
	int* m_height;
};
void test01()
{
	person p1(18,160);
	cout << "p1的年龄为:" << p1.m_age <<"1的身高:"<< *p1.m_height << endl;

	person p2(p1);
	cout << "p2的年龄为:" << p2.m_age << "2的身高:" << *p2.m_height << endl;
}
int main()
{
	test01();
	return 0;
}

深拷贝就是自己重新定义拷贝构造函数,不用系统自带的构造函数。

在上面的代码中,在person类中定义了一个 *m_height属性,在 自己定义的有参构造时 用这个int型指针接收new开辟出来的处于堆区的那个地址,此时如果没有自己定义的那个析构函数(即若用编译器默认的构造函数)就会出现问题,让程序崩掉。

这个问题就是:用系统自带的拷贝构造时,在执行test01函数的 person p2(p1)这条命令时。实际上就是把p1这个空间完完全全连同地址完全复制了一次,尤其是在复制m_height这个属性时,p1和p2的 m_height属性的地址完全是同一个,这就会让你在调用析构函数中的命令时把同一个地址释放两次,这显然会导致程序出错!

而为了解决这个问题,深拷贝应运而生。

深拷贝的解决思路是:因为p1,p2的地址完全一样才会导致相同地址二次释放,可是如果给p2在堆区也开辟一片独立的属于自己的空间,释放时就各自释放各自的了。上述第32行代码就是做了这件事:他先把被拷贝的那个对象的m_height属性解引用出来,此时m_height的值就出来了,再给这个值在堆区new一片自己的空间,再用p2的对象(int型指针 m_height)来接收,这样,析构时p2就有的释放了,程序就不会报错了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-31
在Oracle中,PL/SQL是一种编程语言,允许开发人员编写存储过程、函数和触发器等程序对象。这些程序对象可以使用变量存储数据,其中包括全局变量和局部变量。 全局变量是定义在包中的变量,可以在包中的任何过程或函数中使用。在包中定义变量的语法如下: ``` CREATE OR REPLACE PACKAGE package_name AS variable_name datatype; ... END package_name; ``` 在这个包中,变量名为`variable_name`,数据类型为`datatype`。这个变量可以在这个包中的任何过程或函数中使用。 局部变量是在过程或函数中定义的变量,它们的作用域只在这个过程或函数中。在过程或函数中定义变量的语法如下: ``` CREATE OR REPLACE PROCEDURE procedure_name AS variable_name datatype; ... BEGIN ... END procedure_name; ``` 在这个过程或函数中,变量名为`variable_name`,数据类型为`datatype`。这个变量只能在这个过程或函数中使用,不能在其他过程或函数中使用。 全局变量和局部变量都可以存储不同类型的数据,例如数字、字符、日期等。在使用变量之前,需要先声明变量的类型和名称。在程序执行过程中,可以对变量进行赋值、修改等操作。 需要注意的是,在使用全局变量时,需要注意多个程序对象可能同时访问同一个全局变量,因此需要考虑并发访问的问题。在使用局部变量时,需要注意变量的作用域和生命周期,确保变量只在需要的时候才分配内存空间,并在不需要时及时释放内存空间,以避免资源的浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值