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