More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式
2015-06-26 08:37
851 查看
1. 由于前自增和后自增操作符都是一元运算符,因此重载时通过在后自增中加一个int型参数(哑元参数)加以区分,当后自增被调用时,编译器自动在为该参数指定一个0值。
2. 前自增操作符返回调用它的对象的引用,后自增操作符返回const 临时对象
3. 由于前自增是返回的是原对象的引用,因而可以执行类似于++++a这样的式子;
但是后自增返回的是调用后自增操作符之前的对象的副本,如果后自增操作符返回的临时对象不是const,那么就可能会出现a++++的现象,而第二个++作用的其实是一个临时对象,这显然背离初衷。c++中有一条原则就是“绝对不让用户更改临时对象”(异常处理除外),因为临时对象是由编译器产生的,我们无法主动使用,同时它的生存期也无法由我们来掌握,所以除了用临时对象来充当传入参数或返回值的"载体"外,任何对临时对象的更改都是无意义的,也就被编译器严厉禁止。
至于不能将临时对象传入接受非const 引用的函数,也是同样道理。也就是说,除非返回的是引用,否则返回的都是临时对象,而主动对临时对象做任何更改操作(除了异常处理外),都是不允许的!
4. 由于后自增要创建一个对象保存之前对象的副本,所以比前自增效率要低,在两者效果相同的情况下推荐使用前自增。
5. 如果要同时定义前自增和后自增,对后自增的定义最好以前自增为实现基础,这样可以保证它们行为的一致。
2. 前自增操作符返回调用它的对象的引用,后自增操作符返回const 临时对象
3. 由于前自增是返回的是原对象的引用,因而可以执行类似于++++a这样的式子;
但是后自增返回的是调用后自增操作符之前的对象的副本,如果后自增操作符返回的临时对象不是const,那么就可能会出现a++++的现象,而第二个++作用的其实是一个临时对象,这显然背离初衷。c++中有一条原则就是“绝对不让用户更改临时对象”(异常处理除外),因为临时对象是由编译器产生的,我们无法主动使用,同时它的生存期也无法由我们来掌握,所以除了用临时对象来充当传入参数或返回值的"载体"外,任何对临时对象的更改都是无意义的,也就被编译器严厉禁止。
至于不能将临时对象传入接受非const 引用的函数,也是同样道理。也就是说,除非返回的是引用,否则返回的都是临时对象,而主动对临时对象做任何更改操作(除了异常处理外),都是不允许的!
4. 由于后自增要创建一个对象保存之前对象的副本,所以比前自增效率要低,在两者效果相同的情况下推荐使用前自增。
5. 如果要同时定义前自增和后自增,对后自增的定义最好以前自增为实现基础,这样可以保证它们行为的一致。
相关文章推荐
- [C++ primer]第五章笔记-语句
- g++编C++11/C++0x遇到的问题
- More Effective C++ 条款5 对定制的"类型转换函数"保持警觉
- More Effective C++ 条款4 非必要不提供 default constructor
- C++面试中的singleton类
- 面试时做过的几个C/C++笔试题
- c++编程注意事项
- C++对象内存分布(1) - 私有虚函数
- C\C++代码优化的27个方法
- 【学习笔记】【C语言】指向函数的指针
- More Effective C++ 条款3 绝对不要以多态(polymorphically)方式处理数组
- 【学习笔记】【C语言】返回指针的函数
- More Effective C++ 条款2 最好使用C++转型操作符
- C语言文件操作函数大全
- C语言控制用户输入的字符个数(curses.h代替conio.h)
- 程序编译是碰到的g++ 对c++11支持问题
- C语言标准
- C语言中,关键字static的作用
- c++ 输出虚函数表内容
- C语言:目标代码文件,可执行文件和库