栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 深拷贝 浅拷贝

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 深拷贝 浅拷贝

浅拷贝 

再用一个对象初始化另一个对象的过程中 把对象的值赋给要初始化的对像  又称值传递

如果对象中有指针  会把一个指针付给另一个指针   两个指针指向同一 个空间  在析构回收内存时会出现同一个空间被释放两次的情况

#include
using namespace std;

class AA
{
public:
	int* p;
	
public:
	AA()
	{
		p =new int(100);
	}
	~AA()
	{
		delete p;
		p = nullptr;
	}
};

//默认拷贝构造函数  浅拷贝
//浅拷贝  又称值拷贝  将一个变量的值赋给  要初始化的对象成员变量
//如果成员变量中有指针变量  就会造成空间释放两次的可能
int main()
{
	AA a;
	cout << *a.p << endl;
	AA b=a;
	cout << *b.p << endl;
	//a先执行析构函数  把p赋null    b的p  和  a的p  指向同一个在堆区开辟的空间
	//b在执行析构时  p已经为null  不能再次释放p

	return 0;

}

深拷贝

 在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间

将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间

public:
    int* p;

public:
    AA()
    {
        p = new int(100);
    }
    AA(AA &ra)
    {
        p=new int(* ra.p);

    }
    ~AA()
    {
        delete p;
        p = nullptr;
    }

也就是说  

AA a;
AA b = a;

a  b指向两块空间  两个空间存的值相同

释放时不会出现浅拷贝的情况

#include
using namespace std;




class AA
{
public:
	int* p;

public:
	AA()
	{
		p = new int(100);
	}
	AA(AA &ra)
	{
		p=new int(* ra.p);

	}
	~AA()
	{
		delete p;
		p = nullptr;
	}
};

//深拷贝  在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间
//将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间
int main()
{
	AA a;
	cout << *a.p << endl;
	AA b = a;
	AA c(a);

	cout << *b.p << endl;
	

	return 0;

}

对象作为参数

void Show(AA a)  

再主函数中

AA a;
    Show(a);

实参向形参赋值的过程中  相当于把a实参赋给AA类型的形参a  相当于用一个对象初始化另一个对象  会执行拷贝构造  构造中会开辟空间  是深拷贝

完整代码如下

#include
using namespace std;




class AA
{
public:
	int* p;

public:
	AA()
	{
		p = new int(100);
	}
	AA(AA& ra)
	{
		p = new int(*ra.p);

	}
	~AA()
	{
		delete p;
		p = nullptr;
	}
};

void Show(AA a)
{
	cout << *a.p << endl;
}

//深拷贝  在拷贝的时候先去开辟一个和原对象成员指针变量指向空间大小一样的空间
//将原对象成员指针变量所指向的空间里的值赋给新对象成员变量指针变量指向的空间
int main()
{
	AA a;
	Show(a);


	return 0;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号