剑指 offer set 27 赋值运算符函数

要求为类 CMyString 定义赋值运算符函数. 

类的定义如下

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

private:
	char* m_pData;
};

  

在定义一个赋值运算符时, 需要考虑如下几点

1. 需要把返回值得类型声明定义为该类型的引用, 并且在函数结束前返回实例自身的引用 (*this). 只有返回引用才可以连续赋值

2. 需要把传入参数的类型声明为常量引用. 形参必须是引用, 否则会编译报错

3. 需要判断引入的实例是否是当前实例, 如果是同一个那么不进行赋值, 直接返回. 如果不事先判断就直接赋值, 那么在释放实例内存时就会出现严重的问题. 若传入实例释放了自己的内存, 并且 传入实例就是当前实例, 那么不仅没完成赋值, 当前实例也不完整了

4. 异常安全性. 先创建再复制, 代码如下

CMyString& CMyString::operator=(const CMyString &str) {
	if(this != &str) {
		CMyString strTemp(str);
		swap(this->pData, str.m_pData)
	}
	return *this;
}

  

 

posted @ 2014-02-24 13:13  SangS  阅读(449)  评论(0编辑  收藏  举报