1.在operator = 中,有可能自己给自己赋值
a[i] = a[j] //潜在自我赋值, 当i = j时
*py = *px //潜在自我赋值 当py和px指向同一个地址时
2.自我赋值的不安全性
class Test{...};
class ManTest
{
ManTest& operator = (const ManTest& rhs)
{
delete p;
p = new Test(*rhs.p);
return *this;
}
private:
Test *p;
};
安全问题:当*this和rhs是同一个对象时,delete释放p的内存空间,然后new一块内存指向不存在的空间
所以就出问题
可以改一下operator = 函数
ManTest& operator = (const ManTest& rhs)
{
if(this == &rhs) return *this;
delete p;
p = new Test(*rhs.p);
return *this;
}
3.如果new时候发生异常,如何处理? this.p指针就是野指针了
ManTest& operator = (const ManTest& rhs)
{
if(this == &rhs) return *this;
Test *pTemp = p; //定义一个中介值
p = new Test(*rhs.p);
delete pTemp;
return *this;
}
这样如果new发生异常,不会继续向下指向,p指向原来的内存空间就不会被删除
4.定义一个swap()函数
void swap(ManTest rhs) //注意这里参数类型不是ManTest &rhs;
{....} //按值传参会有一份副本产生,这里将副本的数据赋给this,这样rhs的原来数据不会改变