【C++学习纪录】构造函数中的深拷贝与浅拷贝的问题

在C++中创建一个类时,默认情况下,编译器会自动调用构造函数和析构函数。其中,构造函数包括默认构造函数(无参)、有参构造函数和拷贝构造函数。

在调用拷贝构造函数时,可能会遇到深拷贝与浅拷贝问题。拷贝构造函数默认为浅拷贝,即仅仅将传入的对象的内容简单地复制到新创建的对象上。

因此,浅拷贝的问题在于:如果我们在写类时将一块内存开辟在堆区,并在析构函数中写了程序运行结束后即释放它的代码,浅拷贝时就可能会有多个对象中的指针变量指向同一片区域。而每一个对象在函数运行结束后都会被析构函数所清除,此时因为每次调用析构函数、该片内存都会被释放一次,所以这片内存就会被释放多次。这是非法的操作。

所以,为避免这种情况。我们应该进行深拷贝。即在类中有指针变量的情况下,每次调用拷贝构造函数时,都为这个新对象申请新的地址,通过拷贝这些不同的地址指向的内存中使内容相同。

#include<iostream>
using namespace std;
class temp{
	public:
		temp(int a, int p)
		{
			num = a;
			ptr = new int(p);
			cout<<"有参构造函数"<<endl;
		}
		temp(const temp& b)
		{
			num = b.num;
			//重点!为新创建的对象申请开辟新的内存,但其中数据一样。
			ptr = new int(*b.ptr);
			cout<<"拷贝构造函数"<<endl;
		}
		~temp()
		{
			//释放内存
			delete ptr;
			cout<<"析构函数"<<endl;
		}
		int num;
		int* ptr;
};
//用于测试的打印函数
void test()
{
	temp one(20, 10);
	temp two(one);
	cout<<one.num<<*one.ptr<<endl;
	cout<<two.num<<*two.ptr<<endl;
}
int main()
{
	test();
}``

输出结果:
有参构造函数
拷贝构造函数
2010
2010
析构函数
析构函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值