06. 区分increment/decrement操作符的前置(prefix)和后置(postfix)形式

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++++这种调用,会导致编译报错。

总结:

  • 后置式会返回一个临时对象,当然也会涉及到其析构,而前置式返回的是引用,单一效率而言,前置式要好于后置式,除非真的需要后置式的行为。
  • 后置式的实现应该以前置式为基础,如此只需要维护前置式版本,后置式会自动调整为一致的行为。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值