哑元与运算符重载:前缀++与后缀++

哑元
首先,我们了解下什么是哑元及哑元的作用,某个参数如果在子程序或函数中没有用到,那就被称为哑元。这是程序设计语言中的一个术语,不是FORTRAN独有的,函数的形参又称“哑元”,实参又称“实元”。在C++的运算符重载中,就会用到哑元以区分i++与++i的区别:)且在C/C++中,哑元是可以没有变量名的,如:

int fun(int,int a){   

     return a/10*10;

 }

则在调用时,第一个参数随便给一个值就行了,因为它终会被丢弃。哑元表示虚无的元素,没有实际空间,甚至连名字都可以没有,它只有联系上实元才有意义。
声明并定义一个函数 :

  void   f(int)   
  {   

  }

函数f有一个int参数,但没有给这个参数声明变量,所以在函数的实现中你永远也无法使用这个函数,这个参数只是一个占位符,一般是因为兼容性方面的原因这样做的。又或者在++操作符定义中也需要这种占位符。例如下面的例子就是哑元在运算符重载中的一个应用:
首先,思考一个问题,我们知道重载是通过参数列表的不同来识别函数,但是 编译器如何识别重载的可以前置或后置的自增及自减运算符函数呢?
答案是一样的,通过函数的参数列表的不同。后置自增运算符的参数里有个哑元,而前置自增运算符函数的参数里没有。记住,如果有哑元,则是postfix(后置),否则,就是prefix(前置)

前置:先自增后返回,因此前置自增运算符用新值返回实际自增的对象。这种对象在连续表达式中被用作左值。(引用,改变值再返回)
后置:后置自增运算符通常在自增前返回一个包含对象原始值的临时对象。c++将这样的对象视为右值,不能用于赋值运算符的左边。(先把数值(形参int)返回,再自增),例如,我们看个实际的代码例子:

int i=10;
cout<<i++<<endl;    //i=11;后缀加;先返回后自增;   10
cout<<++i<<endl;    //i=12;前缀加;先自增后返回;   12
#include <iostream>
using namespace std;

class Plus
{

public:
    Plus(int I=1);
    Plus &operator++();//前置++,若返回值不是引用类型,则结果也对,只是返回值不能作为左值被赋值了
    Plus operator++(int);//后置++
    void print();

private:
    int i;

};
Plus::Plus(int I)
{
  i=I;
}
Plus &Plus::operator ++()//前置++,返回this对象的引用,可以作为左值,被赋值。
{
  i+=1;
  return *this;
}

Plus Plus::operator ++(int)//后置++,返回临时对象temp的值,只能作为右值,不能被赋值。
{
  Plus temp=*this;//把当前调用此函数的对象的值赋给temp对象,即拷贝构造
  ++(*this);//调用的是重载的前置版本
  return temp;//返回的是未经修改的值
}
void Plus::print()
{
  cout<<"i="<<i<<endl;
}

int main()
{
Plus a(5),b;
a.print();//5
++a;//a.operator++(),若此处写成++a=b,则相当于是a=b,a被b赋值。
a.print();//6

b=a++;
b.print();//6
a.print();//7
a++;//a.operator++(0)伪值0用于区分前置还是后置
a.print();//8
return 0;
}

前置版本返回一个引用Plus &Plus::operator++(),后置版本返回一个值 Plus Plus::operator ++(int)。
后置版本是利用前置版本来实现的。节约代码,控制代码有余。
前置版本的效率高,因为后置版本需要调用前置版本,所有后置版本效率比前置要低。(++i比i++效率高)
在后置版本里,人为添加一个参数(int),主要是为了区别前置版本,这个参数不会被使用。

英文原版,即C++发明者的解释https://isocpp.org/wiki/faq/operator-overloading#increment-pre-post-overloading

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值