前置和后置操作符的区别(More Effective_C++_6(运算符))

++和- -的原理类似,下面仅++操作符来分析前置和后置的区别


先看一段代码:

class A{
pubilc:
A& operator++();//前置++
const A operator++(int);//后置++

A& operator--();//前置--
const A operator--(int);//后置--

};

A a;
++a;//调用a.operator++()
a++;//调用a.operator++(0)

--a;//调用a.operator--()
a--;//调用a.operator--(0)

从以上代码中,我们大致能看出前置和后置的不同之处:
1. 返回值类型不同,重载后置++或–,返回值类型为const;
2. 参数不同,重载后置++或–,含有参数int;


下面我们再看一段前置和后置具体实现的代码,来了解参数int的意义:

//前置式:先累加后取出
A& operator++(){
*this=*this+1;//累加
return *this;//取出
}


//后置式:先取出后累加
const A operator(int){
A oldValue=*this;//取出
++(*this);//累加(注:这里后置式的实现,以前置式为基础)
return oldValue;//返回累加之前的值
}

关于参数int的作用
看到以上代码段,我们会发现后置++并没有动用参数int,那么,这个参数唯一的作用只是为了区别前置式后后置式而已;


关于返回值为const的问题
另外,为什么后置式操作符返回的值必须是const,这是为什么?原因是为了使a++++不合法,假如返回值类型不是const,那么这和a.operator++(0).operator++(0)的动作类型相同,即第二个调用动作施行于第一个调用动作的返回值对象身上;
当返回值为const时,第一次调用operator++返回的const对象,将被用来进行operator++的第二次调用,然而operator++是个non_const成员函数,所以const对象无法调用,即禁止了a++++;


关于效率问题
前置式的效率比后置式的效率更高,因为后置式每次都必须产生一个临时对象作为返回值之用,而前置式很明显不需要临时对象;所以,处理用户定制类型时,应该尽可能的使用前置式


另外,后置式++和–的实现应该以前置式++和–为基础,这样的好处是,你只需要维护前置式的版本,因为后置式版本会自动调整为一致行为


参考:More Effective C++中文版(侯捷译)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值