2013-03-22 109 views
2

的。如果我宣佈一個對象是這樣的:範圍內,括號聲明的對象

void main() 
{ 
    myclass objectA(anotherclass(true,true,0)); 
} 

即我通過直接調用後者的構造函數創建一個對象A和另一個對象「anotherclass」,什麼是「anotherclass」」範圍?

只有當main()完成時纔會被破壞嗎?

回答

4

在包含它的完整表達式的末尾,即對myclass的構造函數的返回返回時,臨時對象被破壞。

每個段落的C++ 11標準的12.2/3:

臨時對象被銷燬作爲評價全表達式(1.9)的最後一步 即(詞法)包含點他們被創建了。即使評估在拋出異常時結束,也是如此 。破壞臨時對象的值計算和副作用僅與全表達式相關聯,而不與任何特定的子表達式相關聯。

出於這個原因,如果myclass的構造通過參考(無論是左值參考const或右值參考)開anotherClass類型的參數,不得將其存儲以供將來使用,因爲它會被懸掛如果臨時傳遞,並且取消引用它將是未定義的行爲。

只有objectA超出範圍,並從main()函數返回時被破壞。

+0

謝謝!請問你在哪裏學習C++和C++ 11? – 2013-03-22 22:51:39

+1

@JohnnyPauling:嗯,我想在過去三個月裏花了很長時間在SO上:)這是最好的學習場所。 – 2013-03-22 22:52:38

+0

我同意你的觀點,這就是爲什麼我問這麼多問題,儘管其中許多問題都很愚蠢。感謝像你這樣的人我一直在學習!謝謝! – 2013-03-22 22:56:40

2

anotherclass對象沒有範圍。範圍是名稱的屬性,而不是對象的屬性,並且該對象未被命名。這只是一個臨時對象,並將在完整表達式的末尾被銷燬。

下面的範圍的定義(§3.3.1):

一般來說,每一個特定的名稱是有效的僅在程序文本的一些可能不連續 部分稱爲其範圍

+0

嗯。那麼如何重寫一下類似「當對象被超出範圍時被破壞」的東西,我認爲這是表達對象生命週期結束的常用方式? – Roddy 2013-03-22 22:51:32

+0

謝謝你的回答,你真的幫了我很多! – 2013-03-22 22:57:24

+0

@Roddy對於很多對象來說這是真的。當名稱超出範圍時,已命名並具有自動存儲持續時間的對象將被銷燬。 「當物體超出範圍時」只是一種更快捷的說法。對象的生命週期的真正定義是非正式的,當它是析構函數啓動時。 – 2013-03-22 22:59:43