要求:如下类型为CMyString的声明,请为类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char *pData = nullptr);
CMyString(const CMyString &);
~CMyString(void);
private:
char *m_pData;
};
测试用例:
- 把一个CMyString的实例赋值给另外一个实例
- 把一个CMyString的实例赋值给自己
- 连续赋值
本题考点:
- 对C++基本语法的理解,如运算符重载、常量引用等。
- 考查对内存泄漏的理解
- 对于高级程序员还考查对代码异常安全性的理解
源代码:
#include <cstring>
#include <cstdio>
class CMyString
{
public:
CMyString(char *pData = nullptr);
CMyString(const CMyString &);
~CMyString(void);
CMyString& operator = (const CMyString &);
private:
char *m_pData;
};
CMyString::CMyString(char *pData)
{
if (nullptr == pData)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
m_pData = new char[strlen(pData) + 1];
strcpy(m_pData, pData);
}
}
CMyString::CMyString(const CMyString &str)
{
//获得原有内存大小,按字节拷贝
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
}
CMyString::~CMyString()
{
delete[]m_pData;
}
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;
}
参考代码:https://github.com/zhedahht/CodingInterviewChinese2/tree/master/01_AssignmentOperator
自己代码:https://github.com/quinta2019/Offer/tree/master/01_Q_AssignmentOperator