c 號過載及函式返回值臨時變數問題

2022-03-27 13:08:33 字數 1687 閱讀 2396

今天寫c++操作符過載發現了一些問題,遂向師兄請教,於是引出一堆問題,討論過程中,也解了我幾個大疑惑。

首先寫乙個c++類,如果你不顯示實現,c++會幫你實現拷貝,=號過載,無參預設建構函式等三個基本成員函式。

感覺上拷貝和=號過載其實是乙個意思,但是編譯器不這麼幹,這兩個是分別實現的。

無參建構函式是其成員各自呼叫自己的無參建構函式,如此迴圈呼叫下去。

關於c++的臨時變數,這個很詭異,函式的返回值,寫過匯程式設計序的人知道,函式其實就是乙個小程式段,被呼叫的時候先把引數壓入棧,接著把返回位址壓入棧,函式呼叫完返回的時候,直接ret,ip=返回位址,繼續執行下一條指令(這裡面記不太清了,大概是這麼個意思),但是函式返回值在哪?木有啊,ret只是把cs:ip恢復位置,返回值存在哪?答案是棧中,有返回值c++建立了乙個臨時變數儲存這個返回值,因為這個臨時變數是在執行時建立的,所以只能在棧中。如果想取這個臨時變數的引用,那麼前面必須加const,不然會報錯,但是如果取這個臨時變數的位址的話,不用加const,編譯器僅僅會報乙個警告,所以我們可以修改臨時變數,臨時變數的作用域(這個很危險,因為這個位址可能存放其他重要東西)。臨時變數在棧中會隨時被覆蓋,不安全。話不多說,上**:

上面就是**編譯執行的結果,看到了吧,臨時變數不可靠,連著輸出兩次就出錯了,值被覆蓋了,所以第乙個name欄位就讀不出來了,臨時變數取位址會報警告,如果取引用的話前面不加const會報錯。

如果把注釋塊一注釋去掉,同時把上面指標那一塊注釋掉,看結果:

執行了2次=號過載操作,第一次把返回值拷貝到臨時變數(無名),第二次把臨時變數拷貝到sales_0。

接下來把注釋塊一注釋掉,去掉注釋二,看結果:

可以看到這個只執行了一次拷貝操作,具體原因不知道,猜測可能是編譯器的優化吧。

先寫這麼多了,c++是個大坑呀,果斷學彙編呀,學好了彙編編譯下應該更能看出來編譯器工作原理。

C 函式返回值與臨時變數

c 規定當函式返回的是非引用型別時,函式會建立臨時物件 temporary object 函式返回的就是這個臨時物件。在求解表示式時,如果需要乙個地方儲存其運算結果,編譯器會建立乙個沒有命名的物件,這就是臨時物件。淺顯的說,當你呼叫了函式,函式會 return乙個值 那麼這個值總得有存放的地方吧,編...

C 返回值過載

源文 c 當然是不能僅僅通過返回值過載函式的,但是,我們往往會想 要是支援返回值過載就好了。現在,我就從c 的某個頗受爭議的角落,為您發掘一點東西。假設有這樣乙個函式 type getvalue const dbfield fd 可是,dbfield實際的資料型別對於getvalue來說,並不了解,...

C 函式返回值。

一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...