题目描述:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
实现如下: 是我的解法,适合C++初级程序员
//
// Created by yanpan on 2018/9/30.
//
#if 1
#include <iostream>
using namespace std;
class CMyString
{
public:
CMyString()
{
m_pdata = new char[1];
}
CMyString(char *name)
{
m_pdata = new char[strlen(name)+1];
strcpy(m_pdata,name);
}
CMyString(const CMyString& str);
CMyString& operator = (const CMyString& str) //需要连续赋值所以要返回引用
{
cout<<"CMyString& operator =(const CMyString& str)"<<endl;
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()
{
delete[]m_pdata;
m_pdata = NULL;
}
void show()
{
if(this == NULL)
return;
cout<<m_pdata<<endl;
}
private:
char* m_pdata;
};
int main()
{
CMyString str1;
CMyString str2("world");
CMyString str3;
str3 = str1 = str2; //要连续赋值 连续赋值是调用两次赋值函数
str1.show();
str3.show();
cout<<"hello"<<endl;
return 0;
}
#endif
考虑异常的安全解法:
先创建一个临时实例,接着把strTemp.m_pdata 和 实例自身的 m_pdata 进行交换。因为 strTemp是一个局部变量,程序运行到if 外面时就出了该变量的作用域,就会自动调用strTemp的析构函数,把strTemp.m_pData所指向的内存释放掉,由于strTemp.m_pdata所指向的内存是实例之前m_pdata的内存,这就相当于自动调用析构函数释放了实例的内存。
CMyString(const CMyString& str)
{
cout<<"CMyString(const CMyString& str)"<<endl;
m_pdata = new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
}
//防止申请内存时没有申请成功,对原有实例的状态还没有修改 保证异常安全性
CMyString& operator = (const CMyString& str) //需要连续赋值所以要返回引用
{
cout<<"CMyString& operator =(const CMyString& str)"<<endl;
if (this != &str)
{
CMyString strTemp(str);
char *pTemp = strTemp.m_pdata;
strTemp.m_pdata = m_pdata;
m_pdata = pTemp;
}
return *this;
}