据说古代(20世纪80年代)的程序员,经常因为 C++ 无法区分 ++运算符 以及 -- 运算符 的前缀和后缀调用而发牢骚,于是C++ 语言得到了扩展,允许对前缀与后缀形式的自增和自减进行重载.
重载函数是通过他们参数类型上的差异得以区分,但是不管前缀和后缀形式的自增和自减都没有参数.为了解决语言上的这个问题,c++规定后缀形式有一个int类型参数,当函数被调用时,编译器悄无声息地传递了一个 0 作为参数的值给该函数
如:
++i; //calls i.operator++
i++; //calls i.operator++(0)
不过前缀和后缀最大的区别在于其返回值的类型的不同.前缀形式返回的是一个引用 ,后缀形式返回的是一个const对象.
int& int:: operator++()
{
*this += 1;
return *this;
}
const int int:: operator++(int) //后缀形式具有一个 INT类型的参数
{
const int oldValue = *this;
++(*this);
return oldValue;
}
自增的后缀形式为什么会返回一个const类型的对象呢? 假设返回的不是 const 对象,下面的代码就是正确的:
int i;
i++++;
它等同于 i.operator++(0).operator(0);
很明显, 第二个 ++ 是由第一个 ++ 所返回的对象来调用的,这和我们期望所得的值并不一样.
c++ 禁止 int 类型那么做,而最容易的方法就是返回一个 const 类型对象.
重载函数是通过他们参数类型上的差异得以区分,但是不管前缀和后缀形式的自增和自减都没有参数.为了解决语言上的这个问题,c++规定后缀形式有一个int类型参数,当函数被调用时,编译器悄无声息地传递了一个 0 作为参数的值给该函数
如:
++i; //calls i.operator++
i++; //calls i.operator++(0)
不过前缀和后缀最大的区别在于其返回值的类型的不同.前缀形式返回的是一个引用 ,后缀形式返回的是一个const对象.
int& int:: operator++()
{
*this += 1;
return *this;
}
const int int:: operator++(int) //后缀形式具有一个 INT类型的参数
{
const int oldValue = *this;
++(*this);
return oldValue;
}
自增的后缀形式为什么会返回一个const类型的对象呢? 假设返回的不是 const 对象,下面的代码就是正确的:
int i;
i++++;
它等同于 i.operator++(0).operator(0);
很明显, 第二个 ++ 是由第一个 ++ 所返回的对象来调用的,这和我们期望所得的值并不一样.
c++ 禁止 int 类型那么做,而最容易的方法就是返回一个 const 类型对象.