日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++深度剖析教程19】前置操作符与后置操作符

發(fā)布時(shí)間:2023/12/10 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++深度剖析教程19】前置操作符与后置操作符 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天來學(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)生了一些意想不到的事:

  • 優(yōu)化使得最終的二進(jìn)制程序更加高效
  • 優(yōu)化后的二進(jìn)制程序丟失了C/C++原有的語義
  • 不可能從編譯后的二進(jìn)制程序,還原C/C++程序。
  • 二拓展

    問題:
    那么,++操作符可以被重載么,能夠重載的話,又是如何區(qū)分前置++與后置++的?

    回答:
    ++操作符可以被重載

  • 全局函數(shù)和成員函數(shù)都可以被重載
  • 重載前置++操作符不需要額外的參數(shù)
  • 重載后置++操作符需要一個(gè)int類型的占位參數(shù)
  • 下面我們還是來直接寫一個(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é)

  • 編譯優(yōu)化使得最終的可執(zhí)行程序更加高效
  • 前置操作符++與后置操作符++都可以被重載
  • ++操作符的重載必須符合其原生語義
  • 對(duì)于基礎(chǔ)類型,前置和后置++操作符效率幾乎一樣
  • 對(duì)于類類型,前置++的效率高于后置++的效率
  • 想一起探討以及獲得各種學(xué)習(xí)資源加我(有我博客中寫的代碼的原稿):
    qq:1126137994
    微信:liu1126137994
    可以共同交流關(guān)于嵌入式,操作系統(tǒng),C++語言,C語言,數(shù)據(jù)結(jié)構(gòu)等技術(shù)問題。

    總結(jié)

    以上是生活随笔為你收集整理的【C++深度剖析教程19】前置操作符与后置操作符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。