【C++基础】赋值运算符重载

给出如下CMyString声明,添加赋值运算符函数:

class CMyString
{
public:
    CMyString(char* pData = NULL);
    CMyString(const CMyString& str);
    ~CMyString(void);
      
private:
    char* m_pData;
};

定义一个赋值运算符函数时,需要注意如下几点:

  • 返回值的类型为该类型的引用;函数返回自身实例的引用(*this);只有返回一个引用,才允许连续赋值(str1 = str2 = str3);
  • 形参为常量引用;传值会导致调用一次拷贝构造函数;
  • 释放之前内存,内存泄漏;
  • 传入的参数是否为自身;为自身则直接返回;如果事先不判断,则可能会导致释放了自身的内存;

代码如下:

CMyString& CMyString::operator=(const CMyString& other)
{
    if (this == &other)
	{
	    return *this;
	}
	
	if (m_pData)
	{
	    delete [] m_pData;
		m_pData = NULL;
	}
	
	m_pData = new char[strlen(other.m_pData) + 1];
	strcpy(m_pData, other.m_pData);
	
	return *this;
}

进一步考察,我们在析构函数中同样显式的释放了 m_pData的内存,但是如果我们添加一个新的指针变量,则需要在多处同时添加 delete操作,这通常会产生安全隐患;

可以利用析构函数释放所有的内存:

CMyString& CMyString::operator=(const CMyString& other)
{
    if (this != &other)
	{
	    CMyString temp(other);
		
		char* pTemp = temp.m_pData;
		temp.m_pData = m_pData; // 将临时变量的数据域指向当前实例的数据域
		m_pData = pTemp;        
	}
	
	return *this;
}

将临时变量的数据域指向当前实例的数据,由于 temp是临时变量,出了 if作用域之后调用虚构函数,吧 temp.m_pData所指的内存释放掉;由于此时 temp.m_pData所指的内存就是当前实例之前的 m_pData,相当于释放了实例的内存;


参考:

http://zhedahht.blog.163.com/blog/static/25411174200741543224391/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值