2016-11-27 41 views
1

當讀的書編程:使用C++的原則和做法,第2版我沿着下面的語句來:爲什麼全局定義「const Date default_date(1970,1,1);」壞?

...你是什麼做的,如果你真的需要一個全局變量(或常量) 與一個複雜的初始化?一種可能的例子是,我們 想要一個默認值我們提供了一個圖書館 支持業務交易日期類型:

const Date default_date(1970,1,1); // the default date is January 1, 1970

我們怎麼會知道default_date從未使用過它是 初始化之前?基本上,我們無法知道,所以我們不應該寫 定義...

什麼讓我好奇這行代碼是其定義之前,使用全局變量的隱含的想法。作者(Bjarne Stroupstrup)在其初始化之前使用全局變量究竟意味着什麼?當然,也可以在其他地方聲明變量。但是沒有提到那種情況。

回答

2

如果在全局範圍內聲明另一個對象,或者在其他地方使用複雜的構造函數,那麼對specify the relative initialization order of these two objects in a portable manner沒有實際意義。對於任何一個對象,您都不能期望在引用它之前構造了另一個對象。

只要完全理解全局對象在不同翻譯單元中的相對初始化順序沒有被指定,那麼聲明全局單例對象就沒什麼內在錯誤,因爲它們是有意義的。

+0

如果我得到正確的這個問題,只有在其他全局初始化引用這個default_data變量時纔會出現? – Sam

+1

正確。所有全局對象將在調用'main()'之前被初始化。這是唯一的保證(除了在相同的翻譯單元中的相對初始化順序)。 –

+1

如果您可以創建全局'constexpr',那麼您可以避免在初始化之前使用它。根據其設計和實施情況,「日期」可能或不可能。 –

相關問題