C++深浅拷贝与=运算符重载

文章目录


浅拷贝又称值拷贝,类中默认生成的拷贝构造函数使用的是浅拷贝eg:

class B
{
public:
	B(int n1 = 0, int n2 = 0)
		:_num1(n1), _num2(n2)
	{}
	B(const B &s)
	{
		_num1 = s._num1;
		_num2 = s._num2;
	}
private:
	int _num1;
	int _num2;
};

int main()
{
	B s1(1,2);
	B s2(s1);
}

浅拷贝只是将基本类型的值变的相同,但当遇到一些其他类型,默认的拷贝构造函数可能会出现问题
eg:

class A
{
public:
	A(const char* str="")
		:_str(new char[strlen(str)+1])
	{
		strcpy(_str, str);
	}
	~A()
	{
		delete[] _str;
		_str = nullptr;
	}
private:
	char* _str;
};

int main()
{
	A s1;
	A s2(s1);
}

这里用默认拷贝构造函数

因为_str指向的是一块空间,如果用简单的值拷贝,s1与s2中的_str指向的是同一块空间的地址。
在这里插入图片描述
主函数结束后会调用析构函数,因为两对象中_str指向的空间相同,所以对相同空间连续析构两次导致程序崩溃。

所以这里的拷贝构造函数要先新开辟数组,在把值拷贝到新开辟的数组中。

A(const A&s)
		:_str(new char[strlen(s._str)+1])
	{
		strcpy(_str, s._str);
	}

与之相类的还有

=运算符的重载

也不能让其指向相同的空间,这里我们选择先将原来对象_str指向的空间释放掉,在新开辟一块与新对象_str相同大小的空间,再复制过去。

A& operator=(const A &s)
	{
		delete[]_str;
		_str = new char[strlen(s._str) + 1];
		strcpy(_str, s._str);
		return *this;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值