解析區域性物件與臨時物件

2021-06-27 21:33:48 字數 1166 閱讀 6233

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

區域性物件就是可見區域在乙個函式範圍的物件。

區域性物件有兩種,靜態區域性物件的生存期起於所在函式第一次被呼叫,結束於main()函式退出之後自動區域性物件生存期起於所在函式每一次被呼叫,結束於函式返回。

a fun()

a a;

a = fun();//呼叫fun,產生乙個臨時物件;用這個臨時物件為引數呼叫a的拷貝賦值操作符,然釋放臨時物件

const a b& = fun();//呼叫fun,產生乙個臨時物件,這個物件並不會馬上被釋放,而是會在離開b的作用域後釋放,因為它被b引用了

臨時物件

臨時物件是看不見的,不出現在源**中。通常兩種條件下會產生:

1為了使函式成功呼叫而進行的隱式型別轉換

2 函式返回物件時

在任何時候只要見到常量引用(reference to const)引數,就存在建立臨時物件而繫結在引數上的可能性

任何時候只要見到函式返回物件,就會有乙個臨時物件被建立

區域性物件

靜態區域性物件:在首次進入到定義該靜態物件的函式時,進行構造,存放在全域性資料區,其生命期與程式的執行生命期相同。

區域性物件:在函式開始執行時,按出現的順序統一定義,存放在棧中,其生命期同函式的生命期。

class a  

a get ()  ;

物件a分配在棧中函式返回時已經析構是不可返回的。因此需要建立「臨時物件」。

2.在函式的呼叫者接收了函式返回的「臨時物件」時,如果是作為引用接收的,此時該「臨時物件」即轉變為「永久物件」不再析構。如果是作為非引用接收,則c++將再建立乙個copy物件copy這一「臨時物件」,然後將該「臨時物件」析構。

匿名物件?臨時物件?

關於匿名物件與臨時物件,這個概念不是絕對的,概念的區分往往十分拗口難記。要根據作用域,生存時間和用法來來決定 工作多年這些拗口的概念我從來沒有真的記住過,也沒有乙個部落格講清楚他們的區別。這裡我們參考 effective c 中得稱謂,稱之為區域性物件。但是區域性也是有範圍得。下面論證。1無名則無份...

C 之全域性物件,區域性物件,靜態區域性物件

先說兩個概念 作用域 scope 和生命週期 lifetime 作用域 名字的作用域指的是知道該名字的程式文字區域 生命週期 物件的生命週期指在程式執行過程中物件存在的時間 全域性物件,顧名思義是全域性的物件,其作用域是整個程式文字,其物件的宣告週期是整個程式的執行過程 區域性物件 一般說的區域性變...

臨時物件與左右值

臨時物件是乙個普通的物件,只是由於它並未提供物件名,同時也不像堆物件 無名物件 一樣提供了物件的指標 即知道物件的位址 所以一般只用來作右值,但這並不說明沒有左值屬性 乙個物件必然有左值和右值,系統是否提供給使用者使用則是另外一碼事 與物件相對的概念是文字常量,二者區別在於,是否能夠定址 乙個物件 ...