c++自增、自减运算符的重载和性能分析小结

  


  

  

自增运算符和自减运算符是有前置和后置之分的,如:

        + +//后置自增运算符   + +//前置自增运算符      b——//后置自减运算符   ——b//前置自减运算符   之前      

为了区分所重载的是前置运算符还是后置运算符,c++规定:

  

前置运算符作为一元运算符重载,重载为成员函数的格式如下:
  

        T和操作符+ + ();//前置自增运算符的重载函数,函数参数是空   T和运营商——();//前置自减运算符的重载函数,函数参数是空   之前      

后置运算符作为二元运算符重载,多写一个没用的参数,重载为成员函数的个数如下:
  

        T运营商+ + (int);//后置自增运算符的重载函数,多一个没用的参数   T运营商——(int);//后置自减运算符的重载函数,多一个没用的参数   之前      


  

  

前置和后置运算符重载函数如下:

  

           前置运算符重载的成员函数   后置运算符重载的成员函数               T和操作符+ + ();   T运营商+ + (int);         T和运营商——();   T运营商——(int);            

  

注意到区别了吗?那么问题来了:

  
      <李>为什么前置运算符返回的是引用,李?   <李>为什么后置运算符返回的是普通的对象(临时对象)?李   
  

主要是因为为了保持原本c++前置和后置运算符的特性:

  

前置运算符的特性
  

        int=0//=5 (+ +);可以拆解成://=+ 1;//=5;   (+ +)=5;//前置+ +      之前      

先自增+ 1后,一个的值就为1,然后再参与一个=5的运算,所以最后一个的值是5。

  

这说明(+ +)返回的是自增后变的量,一个变量在后续运算过程中,一个变量的值会被修改。所以前置运算符的重载函数的返回值必须是引用,

。   
      <李>后置运算符的特性李   
  

而后置运算符,是不能作为左值的,也就是(+ +)=5;是不成立的,所以后置运算符的重载函数的返回值就是普通的对象。

  


  

        int main ()   {   CDemo d (10);   cout & lt; & lt;d + + & lt; & lt;“,”;//等价于d.operator + + (0);   cout & lt; & lt;d & lt; & lt;“,”;      cout & lt; & lt;+ + d & lt; & lt;“,”;//等价于d.operator + + ();   cout & lt; & lt;d & lt; & lt;“,”;      cout & lt; & lt;d - & lt; & lt;“,”;//等价于d.operator——(0);   cout & lt; & lt;d & lt; & lt;“,”;      cout & lt; & lt;——d & lt; & lt;“,”;//等价于d.operator——();   cout & lt; & lt;d & lt; & lt;endl;      返回0;   }   之前      

输出结果:

  
  

10、11、12、12
  12日,11日,10,
  

     

假设要实现如上的主要函数输出的结果,该如何编写呢?

  

首先我们先定义好CDemo类,同时也把自增、自减运算符重载函数定义好。

        类CDemo   {   公共:   CDemo (int i=0): m_num (i){}//构造函数      CDemo,操作符+ + ();//前置自增运算符重载   CDemo运营商+ + (int);//后置自增运算符重载      CDemo,运营商——();//前置自减运算符重载   CDemo运营商——(int);//后置自减运算符重载      私人:   int m_num;//成员变量   };      之前      

接着继续实现前置自增、自减运算符重载函数:

     //前置+ +   CDemo,CDemo::操作符+ + ()   {   + + m_num;   返回*;   }//前置—   CDemo,CDemo::运营商——()   {   ——m_num;   返回*;   }      之前      

后置自增、自减运算符重载,就有点不同,例如后置+ +,是先参与运算,再进行自增,所以返回值是没自增前的对象,具体实现如下:

     //后置+ +   CDemo CDemo::操作符+ + (int)   {   CDemo tmp (*);//记录修改前的对象   m_num——;   返回tmp;//返回修改前的对象   }//后置   CDemo CDemo:运营商——(int)   {   CDemo tmp (*);//记录修改前的对象   m_num + +;   返回tmp;//返回修改前的对象   }      

c++自增、自减运算符的重载和性能分析小结