面试题1:赋值运算符函数
程序员文章站
2022-03-07 20:21:13
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; }......
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
}
1. 经典解法
要点:
- 返回值为该类型的引用,这样才允许连续赋值。
- 传入的参数的类型声明为常量引用,这样可以避免调用复制构造函数,提高代码效率。
- 释放实例自己已有的内存,避免内存泄漏。
- 判断传入的参数和当前的实例(*this)是不是同一个实例。如果是同一个实例,则不进行赋值操作直接返回。因为如果传入自身,一旦释放了自身的内存,传入的参数的内存也同时被释放了,就再也找不到赋值内容了。
//经典解法
CMyString& CMyString::operator = (const CMyString& str)
{
if(this == &str)
return *this;
delete []m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
2. 高级解法
要点: 在刚才的基础上考虑 new 失败抛出异常的情况,则 m_pData 将是一个空指针,赋值失败却也改变了原来的实例。可以先创建一个临时实例,再交换临时实例和原来的实例。
CMyString& CMyString::operator = (const CMyString& str)
{
if(this != &str)
{
CMyString strTemp(str);
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
}
strTemp 是一个临时变量,程序运行到 if 外面时会自动调用 strTemp 的析构函数。
本文地址:https://blog.csdn.net/qq_39976464/article/details/107272275