更多题目请点链接:《 剑指offer》 目录索引
题目描述:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
#include<cstring>
#include<cstdio>
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
void Print();
private:
char* m_pData;
};
思路:
给出的类是String,故在写拷贝构造和赋值运算符重载时要考虑深拷贝,比较简单,直接上代码
代码:
CMyString::CMyString(char* pData )
{
if (pData == nullptr)
{
m_pData = new char[1];
*m_pData = '\0';
}
else
{
m_pData = new char[strlen(pData) + 1];
strcpy(m_pData, pData);
}
}
//拷贝构造
CMyString::CMyString(const CMyString& str)
{
//开空间
char* tmp = new char[strlen(str.m_pData) + 1];
strcpy(tmp, str.m_pData);
//释放旧空间
delete[] m_pData;
m_pData = tmp;
}
CMyString::~CMyString()
{
delete[] m_pData;
}
CMyString& CMyString::operator=(const CMyString& str)
{
if (this != &str)
{
char* tmp = new char[strlen(str.m_pData) + 1];
strcpy(tmp, str.m_pData);
delete[] m_pData;
m_pData = nullptr;
m_pData = tmp;
}
return *this;
}
void CMyString::Print()
{
cout << m_pData << endl;
}
int main()
{
CMyString s;
CMyString s1("hello world");
s.Print();
s1.Print();
CMyString s2(s1);
s2.Print();
CMyString s3;
s3 = s2 = s1;
s3.Print();
system("pause");
return 0;
}