- 题目描述:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数
class CMyString{ public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; };
-
分析:
显然这道题考的是拷贝赋值运算符函数的定义,重点有几个:
- 拷贝赋值运算符函数的返回值类型是该类型的引用,并在函数结束前返回实例自身的引用(*this)。
- 拷贝赋值运算符函数传入的参数类型是该类型的常量引用
- 要释放实例原有的内存
- 要判断传入参数是否是当前实例本身,如果传入的是实力本身而又释放了实例的内存,就会导致严重错误。
接下来就可以写这个函数了,有两种方法,方法一是我按照c++ primer中的方法写的,也就是先new分配一个新内容将原内容拷贝过去,再delete原内存。方法二是剑指offer上的,先创建一个临时的实例(类对象,用传入的参数初始化),然后交换临时实例和原实例(在函数结束后临时实例被释放)。
- 方法一:
CMyString& CMyString::operator==(const CMyString& str) { //成员char*是字符串数组,new和copy的方式很重要 char *newdata = new char[strlen(str) + 1]; strcpy(newdata,str.m_pData); //新内存分配完成,再进行delete,这里先new后delete防止了内存不足报错而m_pDate已空的情况 delete []m_pData; m_pDate = newdata; return *this; }
- 方法二:
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; }
这一题考的是拷贝控制的内容,拷贝控制部分包括拷贝构造函数、拷贝赋值运算符、析构函数等等内容,有必要找时间进行总结。
晚来天欲雪,能饮一杯无?