如下为类型声明,为该类添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
需要注意以下问题:
1.返回值是否为引用:如果不是引用则不可以进行连续赋值(str1 = str2 = str3)
2.是否传入常量引用:常量可以保证不会改变实例的状态,引用可以提高代码效率
3.是否释放自身已有内存:如果未释放则会出现内存泄漏
4.是否防止自赋值:如果释放自身内存,则找不到需要赋值的内容
为主函数添加合适的函数声明
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& CMyString::operator =(const CMyString &str);
private:
char* m_pData;
};
解决方法1
#include <string.h>
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将为空指针,继续操作会导致崩溃
方法1,先new,后delete
方法2,先创建一个临时实例,再交换临时实例的指针与原来实例的指针,当临时实例出作用域时则会自动析构,如果在拷贝构造函数中new失败,我们可以抛出异常等,但是原来的实例仍然存在
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;
}