C++ Super-FAQ 『Assignment Operators』
2016-03-01 11:36
260 查看
赋值操作符的关键在于自赋值机制的处理
重载赋值操作符时需要考虑自赋值问题,否则可能会导致严重错误。
Fred& operator= (const Fred& f)
}
该例子还有一个错误,若在new中抛出异常,则p_会变成野指针。
赋值操作代码的目的不是为了使自赋值更快。若当前代码能够正常处理自赋值(即使很慢),那就不要讲if语句添加至赋值操作符代码中。因为自赋值极少出现,也就无需使自赋值变得更有效率,增加不必要的if判断会使更多的赋值操作承担额外开销。这就是punishing the many to benefit the few.
派生类的赋值操作符需要调用基类的赋值操作符吗?
若创建了自定义的赋值操作符,则需要显示调用基类的赋值操作符,因为编译器不会自动调用;
若未创建自定义赋值操作符,编译器则会自动调用基类的赋值操作符。
重载赋值操作符时需要考虑自赋值问题,否则可能会导致严重错误。
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.
派生类的赋值操作符需要调用基类的赋值操作符吗?
若创建了自定义的赋值操作符,则需要显示调用基类的赋值操作符,因为编译器不会自动调用;
若未创建自定义赋值操作符,编译器则会自动调用基类的赋值操作符。
相关文章推荐
- 老赖学iOS开发--<2>--C语言运算符/表达式
- C++上机报告(示例)
- C++ 的学习要点!
- Yuv420转Jpeg(C语言实现)
- c语言冒泡实现将一个字符串按照字典顺序输出
- C++笔记:4
- C++经典面试算法题
- c++实验-编程序,输入两个整数a和b,输出它们的和及差
- C/C++冒泡排序,然后二分法搜索寻值
- 面试中的C++常见问题
- C++中sort()及qsort() (不完整介绍)
- C/C++中函数参数传递详解
- OC语言-runtime
- STL Vector remove()和erase()的使用
- c++ 11 lamda表达式
- C++中erase函数的使用,可以用来删除内存擦除
- C++项目中的extern "C" {}
- sift算法c语言实现
- 1082. Read Number in Chinese (25)
- OC语言-block and delegate