解析局部對象與臨時對象

http://blog.csdn.net/lujiandong1/article/details/42195595

沒有名字的對象就是臨時對象,它存在於完整的表達式的生存其間。也就是說,當表達式計算結束後就會被釋放。一個例外是,當臨時對象被引用時,它的生存期將延長到與這個引用的生存期一樣長

局部對象就是可見區域在一個函數範圍的對象。
局部對象有兩種,靜態局部對象的生存期起於所在函數第一次被調用,結束於main()函數退出之後自動局部對象生存期起於所在函數每一次被調用,結束於函數返回。
A fun()
{
return A();//創建一個A的臨時對象並返回。這個臨時對象將被拷貝給調用者的臨時對象,然
後釋放(在進行了RVO時不創建臨時對象,而是直接構造調用者的臨時對象)。
}

A a;
a = fun();//調用fun,產生一個臨時對象;用這個臨時對象爲參數調用a的拷貝賦值操作符,然釋放臨時對象

const A b& = fun();//調用fun,產生一個臨時對象,這個對象並不會馬上被釋放,而是會在離開b的作用域後釋放,因爲它被b引用了

臨時對象
臨時對象是看不見的,不出現在源代碼中。通常兩種條件下會產生:
1爲了使函數成功調用而進行的隱式類型轉換
2 函數返回對象時
在任何時候只要見到常量引用(reference to const)參數,就存在建立臨時對象而綁定在參數上的可能性
任何時候只要見到函數返回對象,就會有一個臨時對象被建立

局部對象
靜態局部對象:在首次進入到定義該靜態對象的函數時,進行構造,存放在全局數據區,其生命期與程序的運行生命期相同。
局部對象:在函數開始執行時,按出現的順序統一定義,存放在棧中,其生命期同函數的生命期。


 class A  { -----}

     A get ()  {  A a;  
                return a;
                };
對象a分配在棧中函數返回時已經析構是不可返回的。因此需要創建“臨時對象”。

2.在函數的調用者接收了函數返回的“臨時對象”時,如果是作爲引用接收的,此時該“臨時對象”即轉變爲“永久對象”不再析構。如果是作爲非引用接收,則c++將再創建一個copy對象copy這一“臨時對象”,然後將該“臨時對象”析構。


發佈了12 篇原創文章 · 獲贊 21 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章