操作符——区别C++前置++和后置++

0

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。它们之间的主要区别是它们的返回值和副作用的发生时间。

  1. ++i是前置递增运算符,它首先将变量递增1,然后返回递增后的值。
int i = 1;
int result = ++i;
// 现在,i 的值是 2,result 的值也是 2

  1. 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++++,第二个 ++ 运算符没有操作数,因此不是有效的表达式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值