- 赋值操作符的关键在于自赋值机制的处理
重载赋值操作符时需要考虑自赋值问题,否则可能会导致严重错误。
Fred& operator= (const Fred& f)
{
// Bad code: Doesn‘t handle self-assignment!
delete p_; // Line #1
p_ = new Wilma(*f.p_); // Line #2
return *this;
}
该例子还有一个错误,若在new中抛出异常,则p_会变成野指针。
赋值操作代码的目的不是为了使自赋值更快。若当前代码能够正常处理自赋值(即使很慢),那就不要讲if语句添加至赋值操作符代码中。因为自赋值极少出现,也就无需使自赋值变得更有效率,增加不必要的if判断会使更多的赋值操作承担额外开销。这就是punishing the many to benefit the few.
- 派生类的赋值操作符需要调用基类的赋值操作符吗?
若创建了自定义的赋值操作符,则需要显示调用基类的赋值操作符,因为编译器不会自动调用;
若未创建自定义赋值操作符,编译器则会自动调用基类的赋值操作符。
时间: 2024-10-29 12:16:52