您的位置:首页 > Web前端

《剑指offer》 学习笔记(一)

2016-01-22 19:45 309 查看

面试题一:赋值运算符函数

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数

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

private:
char* m_pData;
};


经典解法:

CMyString& CMyString::operator = (const CMyString& str)
{
if(this == &str)
return *this;

delete []m_pData;
m_pData = NULL;

m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);

return *this;
}


这题考察如下几个点:

为了实现连续赋值,必须返回实例自身的引用
把传入的参数的类型声明为常量引用
释放实例自身已有的内存
判断传入的参数和当前的实例是否为同一个实例

PS:为了实现连续赋值,必须返回实例自身的引用

在《Effective C++》中,这个问题也被提到,参考条款10:令 operator= 返回一个 reference to *this。
关于赋值,我们可以把他写成连续的形式,例如:
int x,y,z;
x=y=z=15;
赋值采用右结合律,上述连锁赋值被解析为:
x=(y=(z=15));
我们可以发现即使不采用引用,代码一样可以通过代码一样可以通过。
所以说赋值运算符重载要返回引用,应该是用于类似 (x=y)=z这样的再次对左值进行写操作的表达式
这个协议适用于所有赋值相关运算符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: