簡體   English   中英

靜態成員函數初始化靜態成員變量 - 用法和風險?

[英]Static member function to initialize static member variable - usage and risks?

在In MyClass.h中

class MyClass 
{
    static vector<type> types;
    static vector<type> createTypes();
}

在MyClass.cpp中

vector<type> MyClass::types = createTypes();

MyClass::MyClass()
{
}

什么時候執行createTypes()並且這種初始化靜態變量的方法是否涉及任何風險?

main()啟動之前,該函數將與其他靜態初始化程序一起調用。 除了使用其他靜態初始化方法之外,您不會冒任何風險。

請記住,所有靜態初始化器都應設計成避免觸發SIOF - 靜態初始化命令Fiasco。

同一翻譯單元中的靜態初始化程序按其在文件中聲明的順序執行。 然而,在多個翻譯單元初始化順序沒有定義。 當靜態初始化程序依賴於另一個轉換單元時,SIOF就會出現。

然后,根據月亮的相位,要么兩個對象都將以正確的順序初始化並且一切都會起作用,或者它們將以相反的順序初始化並且您將使用尚未構造的對象 - 接着會出現未定義的行為。

SIOF-guard模式通過替換如下的靜態變量來避免這種情況:

std::list<Foo> gFoos;

...使用包含變量作為本地靜態的函數:

std::list<Foo> &gFoos() {
    static std::list<Foo> theList;
    return theList;
}

這樣,變量總是在函數的第一次調用時初始化,並且在構造之前無法訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM