注意点
返回值的类型为该类型的引用,函数结束前返回实例自身的应用(*this)
只有返回一个引用,才可以连续赋值;
如果返回值为void,语句str1=str2=str3无法通过编译
传入参数的类型为常量引用
如果传入的参数不是引用而是实例,从形参到实参会调用一次复制构造函数;
参数为引用可以提升效率;
赋值运算符函数内不会改变传入的实例的状态,所以应为常量类型;
释放实例自身已有的内存
在分配新内存之前应该释放自身已有的空间,否则会造成内存泄漏
判断传入的参数和当前的实例是不是同一个实例
若是同一个则不进行赋值,直接返回;
如若不判断就进行赋值,那么会在释放实例内存时释放掉参数的内存,无法再进行赋值;
代码
class CMyString
{
public:
CMyString(char* pData=nullptr);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
CMyString& CMyString::operator =(const CMyString& str)//判断传入的参数和当前的实例是不是同一个实例
{
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;
};