More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式
1. 由于前自增和后自增操作符都是一元运算符,因此重载时通过在后自增中加一个int型参数(哑元参数)加以区分,当后自增被调用时,编译器自动在为该参数指定一个0值。
2. 前自增操作符返回调用它的对象的引用,后自增操作符返回const 临时对象
3. 由于前自增是返回的是原对象的引用,因而可以执行类似于++++a这样的式子;
但是后自增返回的是调用后自增操作符之前的对象的副本,如果后自增操作符返回的临时对象不是const,那么就可能会出现a++++的现象,而第二个++作用的其实是一个临时对象,这显然背离初衷。c++中有一条原则就是“绝对不让用户更改临时对象”(异常处理除外),因为临时对象是由编译器产生的,我们无法主动使用,同时它的生存期也无法由我们来掌握,所以除了用临时对象来充当传入参数或返回值的"载体"外,任何对临时对象的更改都是无意义的,也就被编译器严厉禁止。
至于不能将临时对象传入接受非const 引用的函数,也是同样道理。也就是说,除非返回的是引用,否则返回的都是临时对象,而主动对临时对象做任何更改操作(除了异常处理外),都是不允许的!
4. 由于后自增要创建一个对象保存之前对象的副本,所以比前自增效率要低,在两者效果相同的情况下推荐使用前自增。
5. 如果要同时定义前自增和后自增,对后自增的定义最好以前自增为实现基础,这样可以保证它们行为的一致。