重载 = 运算符实现深拷贝

1.前面已经叙述过浅拷贝的问题,当类成员含有指针时,可以通过显示编写拷贝构造函数的方法,实现用一个类初始化另一个类的深拷贝。

2.但是如果是赋值运算,即例子中的 obj2 = obj1,则不会调用拷贝构造函数,这个时候需要通过重载 = 运算符的方式实现深拷贝,

步骤已经在代码注释中提出。

#include "iostream"
using namespace std;

class Location
{
public:
	Location(char *p)           //一个参数的构造函数
	{
		m_len = strlen(p);
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, p);
	}
	/*
	Location(const Location &obj)                                //深拷贝   拷贝构造函数  显示编写
	{                                                                                 //如果不显示编写,将会调用默认的拷贝构造函数进行浅拷贝
		m_len = obj.m_len;                                              // 下面用重载=运算符的方式实现深拷贝
		m_p = (char *)malloc(m_len + 1);
		strcpy(m_p, obj.m_p);
	}
	*/
	void prinT()
	{
		cout << m_p << endl;
	}
	Location & operator=(Location &obj1)              // 重载= 运算符 ,实现深拷贝。
	{
		//1. 先把原来指向的空间释放,长度置0
		if (this->m_p != NULL)
		{
			delete[] this->m_p;
			this->m_len = 0;
		}
		//2. 按照obj1的长度给obj2分配空间
		this->m_p = new char[obj1.m_len + 1];
        //3. 将obj1内容拷贝给obj2
		strcpy(this->m_p, obj1.m_p);
		//4. 为了支持链式编程,返回引用, 因为=操作符的结合顺序是从右向左的
		return *this;
	}
private:
	char *m_p;
	int m_len;
};

void main()
{
	Location obj1("zhangwentao");
	Location obj2 ("obj2");
	Location obj3("hhhhh");
	
	obj3 = obj2 = obj1;

	obj1.prinT();
	obj2.prinT();
	obj3.prinT();

	system("pause");
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值