剑指offer——C++
赋值运算符函数
面试题1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
class CMyString
{
public:
CMyString(const char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
void Print();
private:
char* m_pData;
};
本题的实现需要注意以下几个方面的问题:(1)返回的值的类型是该类型的一个引用,并且在函数结束之前返回这个类型的一个引用,只有这样才被允许使用连续赋值运算;(2)考虑到自己赋值给自己的情况;(3)在赋值之前释放自己本身已经占有的内存;(4)把传入参数的类型设置为常量引用。
CMyString& CMyString :: operator = (const CMyString& str) {
if (this == &str) return *this;
if (m_pdata != NULL) delete []m_pData;
m_pData = new char[strlen(str) + 1];
strcpy(m_pData, str);
return *this;
// 这种做法会在new失败的时候造成函数的错误,以下的程序可以避免new失败
}
CMyString& CMyString::operator = (const CMyString& str) {
if (!this == &str) {
CMyString isTemp(str);
char* ptemp = isTemp.m_pData;
isTemp.m_pData = m_pData;
m_pData = ptemp;
}
return *this;
// 先创建一个实例,再将实例的m_pData指针与自身的交换
// 这样做可以避免new的时候出现的失败,并且实例isTemp
// 在出if框之后,就出了这个变量的作用域。
}