2011-03-16 269 views
4

在這本書中「C++語言」,作者聲稱對象初始化

有時候,當你設計一個圖書館,這是必要的,或者乾脆方便,去創造一種有一個構造函數和析構函數只有初始化和清理的目的。這種類型只能使用一次:分配一個靜態對象,以便調用構造函數和析構函數。

我很感興趣這種說法是指哪種場景?或者這個聲明如何幫助軟件設計?

書中還舉了一個例子

class Zlib_init{ 
    Zlib_init(); 
    ~Zlib_init(); 
}; 

class Zlib{ 
    static Zlib_init x; 
} 

和書指出

不幸的是,它不能保證,這樣的對象是其第一次使用前初始化,並在最後一次使用後銷燬在由單獨編譯的單元組成的程序中。

爲什麼會發生這種情況?

感謝您的澄清。

+0

你有保證這樣的一個對象將被創建之前main被調用並在主返回後被銷燬。因此,你可能會試圖說:「但是......一切都很好」。不幸的是,你可能在你的程序的某個地方有一個不同的靜態對象,它也使用Zlib_init對象,並且C++語言不能保證它是否會在這個對象或其他對象之前或之後被創建或銷燬,只要它們在不同的編譯單元。所以,措辭可能有些迂腐,但它是100%正確的。 (好吧,無論如何它是正確的,因爲它是Stroustrup)。 – Damon 2011-03-16 16:39:48

回答

2

C++標準沒有指定創建靜態對象的順序。因此,如果你在靜態對象中需要一些層次結構,你需要它們相互依賴(例如,一個應該是另一個的成員)。書中的結構保證了這種行爲。例如,假設的遊戲引擎需要聲音和圖形引擎才能工作,如果您將它們聲明爲單獨編譯單元中的靜態對象,並使用另一個編譯單元,則不能保證它不會失敗,除非您將它們編碼爲你指定的方式。

請參閱C++ faq條目的第二部分您的問題。

+0

在同一編譯單元中,它們按其定義(不是聲明)的順序構造。問題是,當他們分佈在多個單位... – 2011-03-16 16:43:38

+0

謝謝,我已經解決了答案。 – vissi 2011-03-16 16:51:30

0

不幸的是,它不能保證這樣的對象是在第一次使用之前進行初始化,並在由單獨編譯單元的程序其最後使用後被銷燬。

例如,如果你有static存儲在一個模塊中的類的實例,並希望在其他模塊中使用它從另一個類的構造函數static存儲。在這種情況下,你暗示第一個實例將在第二個實例之前初始化。但是,如果實例是在單獨的模塊中定義的,則語言無法指定此順序。

有時候,當你設計一個圖書館,這是必要的,或者乾脆方便,去創造一個構造函數,並初始化和清除的唯一目的析構型。這種類型只能使用一次:分配一個靜態對象,以便調用構造函數和析構函數。

當你與3擋部分需要初始化和結束通話庫工作,這是非常有用的。例如,WinSock 2需要WSAStartup,然後才能調用其他WSA函數,並在您的流程中完成WinSock時調用WSACleanup。如果您有這種類的靜態實例在構造函數中調用WSAStartup並在析構函數中調用WSACleanup,則應該可以在程序的其他位置(除了其他靜態對象的構造函數/結構體)使用WSA函數。