自增运算符和自减运算符是有前置和后置之分的,如:
+ +//后置自增运算符 + +//前置自增运算符 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++自增、自减运算符的重载和性能分析小结