3.自增自减操作符前缀形式与后缀形式的区别

C++允许重载自增,自减操作符。重载函数间的区别取决于它们的参数类型上的差异。C++规定后缀形式有一个int类型的参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。
class UPInt{
public:
UPInt& operator++();        //++前缀重载形式
cosnt UPInt operator++(int);//++后缀重载形式
UPInt& operator--();  //--前缀
const UPInt operator--(int); //--后缀
UPInt& operator+=(int);
...
};
UPInt i;
++i;//调用 i.operator++();
i++;//调用 i.operator++(0);
--i;//调用 i.operator--();
i--;//调用 i.operator--(0);
需要注意的是这些操作符前缀和后缀形式返回值的类型是不同的。前缀返回一个引用,后缀返回一个const类型。
下面以++操作符为例讨论下前缀和后缀
前缀是“先增加后取回”
UPInt& UPInt::operator++()
{
*this+=1;
return *this;
}
后缀是“先取回后增加”
cosnt UPInt UPInt::operator++(int)
{
UPInt oldVal=*this;
++(*this);
return oldVal;
}
后缀操作符函数没有使用它的参数,参数的作用只是用来区分前缀和后缀的函数调用。
后缀必须返回一个对象(增加前的值),但是为什么返回的是const对象呢。看下面:
UPInt i;
i++++;//这里执行了两次后缀++
相当于
i.operator++(0).operator++(0);
这是与内置类型行为不一致的。因为int类型根本就不允许连续进行两次后缀++;
int i;
i++++; //错误
另外一个问题是,即使你那样做了,你一样得不到预期的效果,因为第二次调用operator++(0)改变的是第一次调用返回值的对象,而并不是原始对象的值。所以i++++其实仅仅是增加了一次。这是不正确的。
当我们让后缀返回const对象时,当编译去遇到这样的代码
i++++;
i.operator++(0).operator++(0);
时是不合法的。不能改变const类型的值
从实现上我们其实可以看到,前缀的效率要高于后缀,因为后缀中我们建立了一个临时变量oldval,用来存储返回值,这个变量需要构造和析构。会降低效率。所以在用户自定义类型使用自增运算时尽量使用前缀。
两种操作除了返回值不同外,所完成的功能是一样的,都是值加1,那么在程序维护和升级过程中,如何保持它们不会产生差异。这里我们的原则是后缀应该根据它们的前缀形式来实现。我们仅仅需要维护前缀版本,因为后缀形式自动与前缀形式行为保持一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白话机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值