题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
void Print();
private:
char* m_pData;
};
#include"cmystring.h"
#include<iostream>
using namespace std;
//第一个构造函数
CMyString::CMyString(const char* pData)
{
if (pData == nullptr)
{
m_pData = new char[1];
m_pData = '\0';
}
else
{
int length = strlen(pData);
m_pData = new char[length + 1];
strcpy(m_pData, pData);
}
}
//第二个构造函数
CMyString::CMyString(const CMyString& str)
{
int length = strlen(str.m_pData);
m_pData = new char[length + 1];
strcpy(m_pData, str.m_pData);
}
//析构函数
CMyString::~CMyString()
{
delete[] m_pData;
}
//打印函数
void CMyString::Print()
{
printf("%s", 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;
//}
第二种操作符重载
//考虑安全性问题
CMyString& CMyString::operator=(const CMyString& str)
{
if (this != &str)
{
CMyString strTemp(str);
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
// 把this.m_pData的内存给了临时实例,因此运行出这个if作用域的时候,
//临时实例的析构被调用,将原本实例的内存释放
m_pData = pTemp;
}
return *this;
}