c++ 中的臨時變數指的是那些由編譯器根據需要在棧上產生的,沒有名字的變數。主要的用途主要有兩類:
1) 函式的返回值, 如:
1其中第 8 行會產生乙個臨時變數。但並不是所有返回值都會建立臨時變數,只有當沒有將返回值賦值給其它變數時,臨時變數才會建立。這種臨時變數的生命週期很短,當表示式完成後,它就會被銷毀了。例如上面的**,第 8 行產生的臨時變數,到第 9 行的時候就已經銷毀了。string
proc() 25
6int
main()
7
2) 型別轉換時的中間變數。
1第4行,k+a 由於是 float + int , int 會被轉換成 float 再與 k 相加,這個時候就會生產乙個臨時變數。上面的例子是 build-in type,但對於自定義的類也是同樣適用的。int a = 3;2
3float k = 2.0;4
float f = k + a;
一般來說,c++ 中的臨時變數在表示式結束之後 (full expression) 就被會銷毀,比如前面舉的兩個栗子,但也有例外的時候,如果這個臨時變數被用來初始化乙個引用的話,那這個臨時變數的生命週期就會被延長,直到引用被銷毀,從而不會因此產生懸空(dangling)的引用。
1如上,第 8 行產生的臨時變數因為有 ref 指向,它的生命週期會延長至直到 main() 返回。這個特性有時很有用,比如,你可以用乙個基類的引用指向乙個子類的臨時變數,然後通過這個引用來實現多型,但又不用處理子類的銷毀。string
proc()25
6int
main()
7
1該小技巧在 loki::scopeguard 的實現中被用到了,使得在乙個域內使用多型時,可以避免使用指標,這個寫法是這樣的巧妙以致被 andrei 稱為:"the most important const"。不過需要注意的是,臨時變數只能通過 const 引用來指向,因此是不可修改的。class base()26
};78 class derone: public
base913
};14
15class dertwo: public
base
1620
};21
2223
base getbase()
2427
28derone getderone()
2932
33dertwo getdertwo()
3437
3839
intmain()
40
C 臨時變數的生命週期
c 中的臨時變數指的是那些由編譯器根據需要在棧上產生的,沒有名字的變數。主要的用途主要有兩類 string proc int main 其中第 6 行會產生乙個臨時變數。但並不是所有返回值都會建立臨時變數,只有當沒有將返回值賦值給其它變數時,臨時變數才會建立。這種臨時變數的生命週期很短,當表示式完成...
C 臨時物件的生命週期
有關臨時物件的生命週期有三種情況 1 一般情況 臨時性物件的被摧毀,應該是對完整表示式 full expression 求值過程中的最後乙個步驟。該完整表示式造成臨時物件的產生。例 include using namespace std class a a a operator const a rh...
c變數的生命週期
內部變數 生命週期 函式結束時結束.作用域 宣告的花括號中.儲存區域 棧記憶體區域.不會自動初始化.但會申請空間.外部變數 生命週期 和程式的生命週期一樣.作用域 程式的所以地方做可以使用,但需要使用extren進行宣告.儲存區域 在全域性區域.自動初始化.並生命自身的儲存空間.內部靜態變數 生命週...