1) 不论是 increment 或 decrement 的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++
规定后缀形式有一个 int 类型参数,当函数被调用时,编译器传递一个 0 做为 int 参数的值
给该函数(即:decrement函数)。示例如下:
/******************************************************************************
@-Author : Jacc.Kim
@-create : [11-25-2013 20:33:55]
@-summary : c++的increment与decrement学习
@-modified:
******************************************************************************/
class UPInt
{
public:
/**************************************************************************
@-summary : ++ 前递增操作符重载
@-in param:
@-return :
@-!!!note : 1) 该函数返回的是当前对象自增后的引用。一定注意:是引用。
@- 2) 该函数没有输入参数
@- 3) 下面的 -- 前递减操作符重载类似
**************************************************************************/
UPInt &operator++() {
// 处理递增操作
//
// some code here ![](http://www.cppblog.com/Images/dot.gif)
..
//
// 返回自身实例
return *this;
}
/**************************************************************************
@-summary : ++ 后递增操作符重载
@-in param:
@-return :
@-!!!note : 1) 该函数返回的是当前对象自增前的一个const副本。一定注意:是const副本。
@- 2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
@- 3) 下面的 -- 后递减操作符重载类似
**************************************************************************/
const UPInt operator++(int) {
UPInt retObj = *this;
++(*this);
return retObj;
}
/**************************************************************************
@-summary : -- 前递增操作符重载
@-in param:
@-return :
@-!!!note : 1) 该函数返回的是当前对象自减前的引用。一定注意:是引用。
@- 2) 该函数没有输入参数
**************************************************************************/
UPInt &operator--() {
// 处理递减操作
//
// some code here ![](http://www.cppblog.com/Images/dot.gif)
..
//
// 返回自身实例
return *this;
}
/**************************************************************************
@-summary : ++ 后递减操作符重载
@-in param:
@-return :
@-!!!note : 1) 该函数返回的是当前对象自减前的一个const副本。一定注意:是const副本。
@- 2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
**************************************************************************/
const UPInt operator--(int) {
UPInt retObj = *this;
--(*this);
return retObj;
}
public:
UPInt();
virtual ~UPInt();
};//class UPInt
/******************************************************************************
@-summary : 示例使用UPInt的 ++ 与 -- 的前、后操作符重载
@-in param:
@-return :
******************************************************************************/
void testUPIntIncAndDecOperator() {
UPInt theObj;
++theObj; // 调用 theObj.operator++();
theObj++; // 调用 theObj.operator++(0);
--theObj; // 调用 theObj.operator--();
theObj--; // 调用 theObj.operator--(0);
} 2) 为什么前缀与后缀的返回值会不同??
答:一个后缀 increment 必须返回一个对象(它返回的是增加前的值),但是为什么
是 const 对象呢?假设不是 const 对象,下面的代码就是正确的:
UPInt i;
i++++; // 两次 increment 后缀
这组代码与下面的代码相同:
i.operator++(0).operator++(0);
很明显,第一个调用的 operator++函数返回的对象调用了第二个 operator++函数。
有两个理由导致我们应该厌恶上述这种做法,第一是与内置类型行为不一致。当设计一
个类遇到问题时,一个好的准则是使该类的行为与 int 类型一致。而 int 类型不允许连续进
行两次后缀 increment:
int i;
i++++; // 错误!
第二个原因是使用两次后缀 increment 所产生的结果与调用者期望的不一致。如上所
示,第二次调用 operator++改变的值是第一次调用返回对象的值,而不是原始对象的值。
因此如果:
i++++;
是合法的,i 将仅仅增加了一次。这与人的直觉相违背,使人迷惑(对于 int 类型和 UPInt
都是一样),所以最好禁止这么做。
3) 同样条件下,前缀比后缀操作符来的高效。