C++ 【拷贝构造函数】深拷贝与浅拷贝

本文深入探讨了深拷贝与浅拷贝的区别,通过具体的C++代码示例,详细解释了浅拷贝导致的内存管理问题,以及深拷贝如何避免这些问题,确保每个对象拥有独立的内存空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

☆深拷贝函数主要是解决拷贝函数不能直接拷贝指针所指内存的数据的问题:

其次,介绍一下什么是拷贝构造函数以及拷贝构造函数将在何时被调用?

拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用,其作用是使用一个已经存在的对象来初始化

一个新的同类的对象。

何时被调用?

① 当用类的对象去初始化另外一个对象的时候;

② 当函数的形参为类对象时,调用该函数时,实参赋值给形参;

③ 当函数的返回值是类对象时。

************************************************************************************************************************************

 

一:浅拷贝

1> 首先给出一个demo源码

#include <iostream>
using namespace std;

class A
{
	private:
		int count;
		int *p;
	public:
		A(int x)
		{
			count = x;
			p = new int[x];
		}
		A(A &a)
		{
			this->count = a.count;
			this->p = a.p;
		}
		~A()
		{
			delete[] p;
		}
		int Putcount()
		{
			return count;
		}
};

int main()
{
	A a1(5);
	A a2(a1);
	cout << a1.Putcount() << endl;
	cout << a2.Putcount() << endl;
	return 0;
}

 2>运行结果及分析:

为什么程序到这会崩溃?

因为上述demo中在拷贝函数对指针的拷贝后,使得两个实例化出的类的对象指向了同一个内存地址

然后在默认的析构函数调用的时候,同一个内存地址被释放了两次,然后程序就崩溃了。

为了解决这种问题,也就出现了深拷贝,主要是为不同的对象开辟不同的内存空间,而不是直接让两个指针直接指向了一个内存地址:

 

 

二:深拷贝

1>源码

#include <iostream>
using namespace std;

class A
{
	private:
		int count;
		int *p;
	public:
		A(int x)
		{
			count = x;
			p = new int[x];
		}
		A(A &a)
		{
			this->count = a.count;
			this->p = new int[count];
			for (int i = 0; i < count; i++)
			{
				this->p[i] = a.p[i];
			}
		}
		~A()
		{
			delete[] p;
		}
		int Putcount()
		{
			return count;
		}
};

int main()
{
	A a1(5);
	A a2(a1);
	cout << a1.Putcount() << endl;
	cout << a2.Putcount() << endl;
	return 0;
}

2>运行结果及分析

分析:

这里在拷贝构造函数中首先实例化了指针的内存地址,然后再进行逐个复制,这就是深拷贝,完美的解决了浅拷贝的问题。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值