面试题一:赋值运算符函数
题目:如下为类型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这样的再次对左值进行写操作的表达式
这个协议适用于所有赋值相关运算符。