这里写目录标题
- 1.问题引出
- Q:重载++或者--的时候如何区分前置和后置?
- 2.C+规范
- 3.前后置++实现
- 4.为什么++++i;可以 i++++;不行
1.问题引出
Q:重载++或者–的时候如何区分前置和后置?
以前C+对前置和后置++没有很好的办法可以区分,为了解决这个问题,C++决定扩充,允许++和–操作符的两种形式(前置和后置)拥有重载能力
2.C+规范
这时候出现了一个语法上的问题:重载函数是以其参数类型来区分彼此的,然而不论increment 或decrement 操作符的前置式或后置式,都没有参数。为了填*这个语言学上的漏洞,只好让后置式有一个int 自变量,并且在它被调用时,编译器默默地为该int 指定一个0值:
class UPInt l
// "unlimited precision int.
public:
UPInt& operator++();
//前置式(prefix)++。
const UPInt operator++(int);
UPInt& operator--();
const UPInt operator--(int);
// 后置式(postfix)++。//前置式(prefix)--。// 后置式(postfix)--.
UPInt& operator+=(int);
//+=操作符,结合UPInts和ints.
UPInt i;
++i;i++;--i;i--;
// 调用 i.operator++();// 调用 i.operator++(0);// 调用 i.operator--();// 调用i.operator--(0);
这样的规则或许有点怪异,但你很快就会习惯。重要的是,那些操作符的前置式和后置式返回不同的类型,前置式返回一个reference,后置式返回一个const对象。以下我集中讨论++操作符的前置式和后置式,至于–操作符,故事一样。
3.前后置++实现
从 C的时代回忆起,你或许还记得所谓 increment 操作符的前置式意义“increment and fetch”(累加然后取出),后置式意义“fetch and increment”(取出然后累加)。这两个词组值得记下来,因为它们几乎成为前置式和后置式 incremen操作符应该如何实现的正式规范:
- 前置式代码实现
//前置式:累加然后取出(increment and fetch)。
UPInt& UPInt::operator++()
*this += 1;
return *this;
//累加(increment)。
// 取出(fetch)。
- 后置式代码实现
//后置式:取出然后累加(fetch and increment)。
const UPInt UPInt::operator++(int)
UPInt oldValue = *this;
++(*this);
// 取出(fetch)。
return oldValue;
//累加(increment)。
//返回先前被取出的值。
- 请注意后置式操作符并未动用其参数。是的,其参数的唯一目的只是为了区别前置式和后置式而已。
为什么后置式 increment 操作符必须返回一个对象(代表旧值),原因很清楚。但为什么是个const对象呢?想象一下,如果不这样,以下动作是合法的:
UPInt i;
i++++;
//实施“后置式increment 操作符”两次。
这和以下动作相同:
i.operator++(0).operator++(0);
这就拨云见日了:operator++的第二个调用动作施行于第一个调用动作的返回对象身上
4.为什么++++i;可以 i++++;不行
在C++中,++i和i++都是递增运算符,用于将变量增加1。它们之间的主要区别是它们的返回值和副作用的发生时间。
- ++i是前置递增运算符,它首先将变量递增1,然后返回递增后的值。
int i = 1;
int result = ++i;
// 现在,i 的值是 2,result 的值也是 2
- i++是后置递增运算符,它首先返回变量的当前值,然后将变量递增1。
int i = 1;
int result = i++;
// 现在,i 的值是 2,result 的值是 1
现在来看一下为什么 ++++i 是有效的,而 i++++ 不是有效的。
- ++++i 中的前两个 ++ 是递增运算符,应用于 i。这将使 i 的值增加2,并返回增加后的值。然后,剩下的 ++ 运算符再次递增了这个结果。所以 ++++i 是有效的。
- i++++ 中的第一个 ++ 是递增运算符,应用于 i。这将使 i 的值增加1,并返回递增前的值。然后,剩下的 ++ 运算符在一个临时副本上执行递增操作,而不是在 i 上。因此,i++++ 是无效的,因为第二个 ++ 运算符没有操作数。
- 总结起来,++i 和 i++ 的区别在于返回值和递增操作的发生时间。对于 ++++i 这样的表达式,前两个 ++ 运算符作用于同一个变量,而对于 i++++,第二个 ++ 运算符没有操作数,因此不是有效的表达式。