class UPint
{
public:
UPint& operator ++ (); // 前置版本
const UPint operator ++ (int); // 后置版本, 参数名不需要,因为根本不会使用该参数
}
调用如下:
UPint i;
++i;
i++;
++i实际的调用为i.operator++();
i++实际的调用为i.operator++(0)
。(0由编译器添加,只为区分前置式与后置式)。
前置式实现:
前置式表示"increment and fetch"(累加然后取出)
UPint& UPint::operator ++ ()
{
*this += 1; // increment
return *this; // fetch
}
前置式返回的引用,以便可以进行连续++。++++i;
后置式实现:
后置式表示"fetch and increment"(取出后再累加)
const UPint UPint::operator ++ (int)
{
UPint oldValue = *this; // fetch
++(*this); // increment, 调用前置式版本,所以是后置式以前置式为基础
return oldValue; // return oldValue
}
后置式返回的const对象,因为返回的是操作之前的值,所以必须直接返回对象。而const是为了限制这样调用:i++++
这种调用根本不会进行两次+1操作,第二次调用操作是第一次调用返回的临时对象而已。为了禁止这样的操作,所有将其设置为const,而后置式operator++(int)
本身又不是const成员函数,所以如果出现i++++
这种调用,会导致编译报错。
总结:
- 后置式会返回一个临时对象,当然也会涉及到其析构,而前置式返回的是引用,单一效率而言,前置式要好于后置式,除非真的需要后置式的行为。
- 后置式的实现应该以前置式为基础,如此只需要维护前置式版本,后置式会自动调整为一致的行为。