【C++深度剖析教程19】前置操作符与后置操作符
今天來學習C++中的前置操作符(++i)與后置操作符(i++)。
一回顧
以前在C語言的理論課程中,我們就學過,前置和后置操作符,有一定的區別:
但是我們可以看到下圖,發現前置和后置++的操作符所對應的匯編語言(14行和16行所對應的的匯編完全一樣),是完全一樣的(在linux下的eclipse軟件中進行Debug調試):
這是為什么呢?難道之前學的C語言的理論是錯的么?并不是的,這里面,首先這兩個i經過前后置++后,并沒有被用起來,結果是什么也并不重要,所以現代的編譯器軟件就對程序進行優化,將這兩行語句優化成一樣的:
但是這也產生了一些意想不到的事:
二拓展
問題:
那么,++操作符可以被重載么,能夠重載的話,又是如何區分前置++與后置++的?
回答:
++操作符可以被重載
下面我們還是來直接寫一個代碼,來分析,會更加清晰:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int i){mValue = i;}int value(){return mValue;}Test& operator ++ () //這里返回的是對象的引用,可以對比下面后置++的返回值{++mValue; //前置++操作符效率高一些,因為沒有生成額外的對象,就不需要在??臻g//占用額外的空間,節省了內存,并且不需要調用構造函數以及析構函數return *this; //返回當前對象的指針}Test operator ++ (int) //這里為什么返回的不是引用呢?因為后置++是先需要把值保存起來然后再自加一,所以這里需要一個局部對象,把 { //值保存在這個Test ret(mValue); //先保存值mValue++; //臨時局部的對象中,所以返回值就是類對象的值。再++return ret; } };int main() {Test t(0);Test tt = t++;cout << tt.value() << endl;cout << t.value() << endl;cout << endl;Test tt2 = ++t;cout << tt2.value() << endl;cout << t.value() << endl;return 0; }運行結果為:
0
1
2
2
分析:
程序注釋中,對于操作符的重載已經講解的很清楚。
由打印結果知,前兩個值為0,1,后置操作符先把值給tt,再自己++,這保持了后置操作符的原生語義。同理,由后兩個打印語句,得知前置操作符的原生語義,也被保持了。
那么,這兩個重載的操作符,真正的區別,在哪里呢?
-對于基礎類型的變量
- 前置++與后置++的操作符的效率基本相同
根據項目組編碼規范進行選擇
-對于類類型的對象
前置++的效率高于后置++的效率(具體原因看程序注釋)
- 盡量使用前置++的操作符提高程序的效率
3延伸
那么我們現在就可以來再次完善我們之前實現的復數類了,具體代碼整個代碼過長,我就放到碼云平臺,大家可以自行下載。
點擊下載:點擊下載復數類源碼
4總結
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【C++深度剖析教程19】前置操作符与后置操作符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cisco命令大全
- 下一篇: 最常见的读入数据方法集锦