题目:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数
class CMyString
{
public:
CMyString(char *pData=NULL);
CMyString(const CMyString & str);
~CMyString(void);
private:
char * m_pData;
};
代码及解题思路
#include "iostream"
#include "cstring"
using namespace std;
class CMyString
{
public:
CMyString(const char* pData = nullptr);
CMyString(const CMyString& STR);
~CMyString(void);
char* getString(void); //过去字符串值
CMyString& operator=(const CMyString &str); //重载 '='
private:
char* m_pData;
};
//问题:为类CMyString添加赋值运算符函数
//分析:使用operator对运算符'='进行重载,实现对象赋值
//#define WANGJIANFENG
#ifdef WANGJIANFENG
//方法1 常规解法
//要点:1.该方法必须返回对实例的引用 ,实现连续赋值str1 = str2 = str3
// 2.传入的参数声明为常量引用 const &,避免资源消耗
// 3.分配新的空间时,不忘释放之前的内存空间,避免内存泄漏
// 4.如果是对自身进行赋值,直接返回就好
CMyString& CMyString::operator=(const CMyString &str)
{
if(this == &str)
{
return *this;
}
delete [] m_pData; // 1.释放之前的内存
m_pData = nullptr;
m_pData = new char[(strlen(str.m_pData) + 1)]; // 2.分配内存空间
strcpy(m_pData, str.m_pData); // 3.传递值
return *this;
}
#else
//方法2 进一步考虑异常安全性的解法
// 避免"内存不足 -> new char异常 -> m_pData野指针 -> 程序崩溃"
//要点:1.创建一个临时对象 strTemp,(在构建函数中new对象)
// 2.临时对象和原来的对象进行交换
// 3.由于临时变量,函数结束系统自动执行strTemp的析构函数。销毁内存
CMyString& CMyString::operator=(const CMyString &str)
{
if (this != &str)
{
CMyString strTemp(str);//创建中间对象 值为str.m_pData
//使用临时变量,实现变量与对象的值的交换
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
}
#endif
CMyString::CMyString(const char* pData)
{//构造函数1
if (nullptr == pData)
{//未传递值,给默认值0
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)
{//构造函数2
m_pData = new char[strlen(STR.m_pData) + 1];
strcpy(m_pData,STR.m_pData);
}
CMyString::~CMyString(void)
{//析构函数
delete [] m_pData; //释放空间
}
char* CMyString::getString(void)
{
return this->m_pData;
}
int main(void)
{
CMyString str1("hello zhangsan");
CMyString str2("hello lisi");
CMyString str3("hello wangwu");
str1 = str2;
str2 = str3;
cout << str1.getString() << endl;
cout << str2.getString() << endl;
return 0;
}
我的码云:https://gitee.com/hinzer/sword_to_offer/blob/master/quiestions/question_01.cpp