C 函式返回值與臨時變數

2021-09-21 02:12:14 字數 1072 閱讀 8740

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

我們舉個例子來說明一下,首先定義乙個類:

classbb

(int i)b(

const b &ano)

b&operator=(

const b& rhs)

virtual~b

()};

定義乙個函式:

b func2()

上面的函式返回乙個非引用型別的變數,我們寫兩個測試函式,來看看返回乙個非引用型別的變數會發生什麼

void

test1()

void

test2()

執行測試函式test1(),其執行結果為:

b的建構函式 //構造主方法內的物件t

b的建構函式 //構造fun2內的區域性物件b

b的複製建構函式 //將func2的區域性物件複製到乙個臨時物件

b的析構函式 //析構區域性物件b

b的賦值操作符 //使用臨時物件初始化t

b的析構函式 //析構臨時物件

b的析構函式 //析構物件t

由於 t 的初始化採用的是operator=操作符,operator=要求必須使用乙個已經建立好了的物件對左值進行複製,所以此時必須先形成乙個臨時物件,然後將臨時物件賦值給 t

執行測試函式test2(),其執行結果為:

b的建構函式 //構造fun2內的區域性物件b  

b的複製建構函式

b的析構函式

b的析構函式

由於 t 是通過複製建構函式進行初始化的。複製建構函式初始化要求左值是乙個已有物件,而非建立好了的物件,因此此時不需要建立乙個臨時物件

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

今天寫c 操作符過載發現了一些問題,遂向師兄請教,於是引出一堆問題,討論過程中,也解了我幾個大疑惑。首先寫乙個c 類,如果你不顯示實現,c 會幫你實現拷貝,號過載,無參預設建構函式等三個基本成員函式。感覺上拷貝和 號過載其實是乙個意思,但是編譯器不這麼幹,這兩個是分別實現的。無參建構函式是其成員各自...

10 函式的變數與返回值

1.區域性變數和全域性變數 區域性變數 python中的任何變數都有特定的作用域,在函式中定義的變數,一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數,我們稱為區域性變數 全域性變數 在乙個檔案頂部定義的變數,可以供檔案中的任何函式呼叫,這些可以為整個程式所使用的變數稱為全域性變數。2....

C 函式返回值。

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