C 臨時變數的生命週期

2021-07-17 01:28:26 字數 1331 閱讀 5676

c++ 中的臨時變數指的是那些由編譯器根據需要在棧上產生的,沒有名字的變數。主要的用途主要有兩類:

1) 函式的返回值, 如:

1

string

proc() 25

6int

main()

7

其中第 8 行會產生乙個臨時變數。但並不是所有返回值都會建立臨時變數,只有當沒有將返回值賦值給其它變數時,臨時變數才會建立。這種臨時變數的生命週期很短,當表示式完成後,它就會被銷毀了。例如上面的**,第 8 行產生的臨時變數,到第 9 行的時候就已經銷毀了。

2) 型別轉換時的中間變數。

1

int a = 3;2

3float k = 2.0;4

float f = k + a;

第4行,k+a 由於是 float + int , int 會被轉換成 float 再與 k 相加,這個時候就會生產乙個臨時變數。上面的例子是 build-in type,但對於自定義的類也是同樣適用的。

一般來說,c++ 中的臨時變數在表示式結束之後 (full expression) 就被會銷毀,比如前面舉的兩個栗子,但也有例外的時候,如果這個臨時變數被用來初始化乙個引用的話,那這個臨時變數的生命週期就會被延長,直到引用被銷毀,從而不會因此產生懸空(dangling)的引用。

1

string

proc()25

6int

main()

7

如上,第 8 行產生的臨時變數因為有 ref 指向,它的生命週期會延長至直到 main() 返回。這個特性有時很有用,比如,你可以用乙個基類的引用指向乙個子類的臨時變數,然後通過這個引用來實現多型,但又不用處理子類的銷毀。

1

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

該小技巧在 loki::scopeguard 的實現中被用到了,使得在乙個域內使用多型時,可以避免使用指標,這個寫法是這樣的巧妙以致被 andrei 稱為:"the most important const"。不過需要注意的是,臨時變數只能通過 const 引用來指向,因此是不可修改的。

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進行宣告.儲存區域 在全域性區域.自動初始化.並生命自身的儲存空間.內部靜態變數 生命週...