剑指offer阅读笔记(一)
题目1:赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
// 声明一个类型CMyString
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char *m_pData;
};
定义一个赋值运算符函数如下:
// 定义一个CMyString类型的赋值运算符函数
CMyString& CMyString::operator = (const CMyString &str)
{
if(this == & str)
return *this;
delete []m_pData;
m_pData = NULL;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
需要注意的几个点:
- 把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用 。即,第一句的
MyString&
,最后一句的return *this
- 把传入的参数的类型声明为常量引用 。即,第一行的
&str
;以及,在赋值运算符函数内不会改变传入的实例的状态,因此应该为传入的引用参数加上const
关键字。 - 释放实例自身已有的内存 。在分配内存之前释放已有的空间。即
delete []m_pData;
- 判断传入的参数和当前的实例是不是同一个实例 。如果是同一个,则不进行赋值操作,直接返回。
if(this == & str) return *this;
如果不进行判断就进行赋值,那么在释放实例自身的内存的时候就会导致问题:当*this
和传入的参数是同一个实例时,一旦释放了自身的内存,传入的参数的内存也同时被释放了,那么就再也找不到需要赋值的内容了。
酷酷的未来~