- 连续赋值
例如 int x,y,z;
x=y=z=15;
为实现上述定义,可定义为
class Widget {
public :
Widget& operator=(const Widget& rhs)
{
return* this.
}
}
令赋值操作符号返回一个reference to *this. - 自我赋值
例如 Widget::operator=(const Widgett& rhs)
{
delete pb.
pb=new Bitmap(*rhs.pb);
return *this
}
这是一份不安全的operator实现版本,这里的自我赋值的问题是,operator=函数内的 *this和rhs有可能是同一个对象。如果这样的话delete就不只是销毁当前对象pb,它也销毁了rhs.在函数的末尾,widget持有的指针指向一个被销毁的对象。
如何改变这种错误,有一种做法是在删除前先检查一下this和rhs是否为同一个函数。例如
Widget& Widget::operator=(const Widget& rhs)
{
if(this==&rhs) return *this;
delete pb;
pb=new Bitmap(*rhs.ph);
return this.
}
也可以将pb的指针赋值给一个新的对象。
Widget& Widget::operator=(const Widget& rhs)
{
BitmappOrig=pb;
pb=new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
确保当对象自我赋值时operator=有良好行为,其中技术包括比较“来源对象”和“目标对象”的地址,精心周到的语句顺序,以及copy-and-swap.
确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
operator=的用法
最新推荐文章于 2024-05-28 09:25:21 发布