题目:如下CMyString的声明,请为该类型添加赋值运算符函数。
#pragma once
#include <string.h>
class CMyString
{
public:
CMyString(char*);
CMyString(const CMyString&);
~CMyString(void);
CMyString& operator=(CMyString& str);
private:
char* m_pData;
};
需要考虑以前四点:
1:是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例的引用。只有返回一个引用,才允许连续赋值操作。例如,有3个CMyString类型的对象:str1,str2,str3,可以进行str1=str2=str3,如果返回值是void,如果执行str1=str2=str3,则不能通过编译。
2:是否把传入的参数声明为常量引用。如果传入的参数不是引用而是实例,那么就会从形参道实参会调用一次复制构造函数。并且这样在赋值运算函数内不会改变传入的实例。
3:是否释放了实例自身占有的内存。如果我们忘记在分配内存前释放之前占有的空间,程序将会出现内存泄露。
4:是否判断传入的参数和实例是不是同一个实例。如果没有判断,就会出现严重的问题。当传入的实例和*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;
};
//函数结束后 释放strTemp.m_pData占有的空间,也就是之前this指向的地址的空间