C++靜態(tài)構造函數(shù)相關概念解析

C++靜態(tài)構造函數(shù)相關概念解析

如何才能正確的理解C++靜態(tài)構造函數(shù)呢?這一靜態(tài)函數(shù)在實際應用中能對我們起到些什么樣的作用呢?在這篇文章中大家將會找到這些答案。希望這些內(nèi)容能幫助大家?guī)硪恍椭?,提高對C++的認識。

C++ TinyXML使用心得總結(jié)

兩種C++數(shù)據(jù)指針類型詳細介紹

C++文件操作具體應用函數(shù)介紹

C++跨平臺應用編譯方法詳解

C++框架如何正確理解

在C#中,類的靜態(tài)構造函數(shù)用于在使用類之前進行相關的初始化工作;比如,初始化靜態(tài)成員或執(zhí)行特定操作。CLR 在第一次創(chuàng)建該類對象或調(diào)用該類靜態(tài)方法時自動調(diào)用靜態(tài)構造函數(shù)。同時,CLR保證靜態(tài)構造函數(shù)的線程安全性(準確地說是,只會調(diào)用一次,不存在多線程問題)。

下面是MSDN對C++靜態(tài)構造函數(shù)特點的描述:

1.靜態(tài)構造函數(shù)既沒有訪問修飾符,也沒有參數(shù)

2.在創(chuàng)建第一個實例或引用任何靜態(tài)成員之前,將自動調(diào)用靜態(tài)構造函數(shù)來初始化類

3.無法直接調(diào)用靜態(tài)構造函數(shù)

4.在程序中,用戶無法控制何時執(zhí)行靜態(tài)構造函數(shù)

C++語言規(guī)范并未包含類似靜態(tài)構造函數(shù)的東西,但在使用類之前做初始化工作的需求卻是客觀存在的。就滿足需求本身來講,C++完全可以通過手動方式實現(xiàn),但要處理好初始化時機,線程安全性等問題。本文則嘗試通過C++的模版機制模擬實現(xiàn)靜態(tài)構造函數(shù),避免手動初始化的繁瑣實現(xiàn)。對于需要靜態(tài)構造函數(shù)的類A,只需用繼承static_constructable< A>模版類,并提供 static void statici_constructor()靜態(tài)方法即可:

class A : static_constructable< A>

{?

public:?

static void static_constructor() {?

std::cout < <? "static constructor a" < <? std::endl;?

s_string = "abc"; //初始化靜態(tài)數(shù)據(jù)?

}?

static std::string s_string;?

public:?

A(){?

std::cout < <? "constructor a" < <? std::endl;?

}?

private:?

int m_i;?

};?

std::string A::s_string;?

int _tmain(int argc, _TCHAR* argv[]){?

std::cout < <? "beginning of main" < <? std::endl;?

assert(sizeof(A) == sizeof(int));//繼承不改變A的內(nèi)存布局?

assert(A::s_string == "");?

A a1;?

assert(A::s_string == "abc");?

A a2;?

std::cout < <? "end of main" < <? std::endl;?

return 0;?

}

輸出:

beginning of main?

static constructor a //創(chuàng)建A對象前自動調(diào)用靜態(tài)構造方法,一次且僅一次?

constructor a?

constructor a?

end of main

下面是static_constructable類模板的實現(xiàn):

template< typename T>

class static_constructable?

{?

private:?

struct helper{?

helper(){?

T::static_constructor();?

}?

};?

protected:?

static_constructable(){?

static helper placeholder;?

}?

};

上面的實現(xiàn)把對A::static_constructor()的回調(diào)放到內(nèi)部類helper的構造函數(shù)中;并在static_constructable< A>()中定義一個helper局部靜態(tài)變量;C++保證在構造派生類 A的對象時,會先調(diào)用基類static_constructable< A>的構造函數(shù),且靜態(tài)局部變量只會構造一次,這樣就達到調(diào)用一次且僅一次A::static_constructor()的目的。< /span>

static_constructor類模板簡單地模擬了C#的靜態(tài)構造函數(shù)機制,C++靜態(tài)構造函數(shù)具有以下特點:

1. 在第一次構造類對象之前自動調(diào)用類提供的靜態(tài)構造函數(shù)

2. 靜態(tài)構造函數(shù)被調(diào)用的時機是確定的

3. 利用了C++的局部靜態(tài)變量初始化機制保證了線程安全性(更正:實際并非線程安全,C++標準不涉及多線程問題,而一般編譯器實現(xiàn)也非線程安全,更多參見評論部分)

4. 基于繼承的實現(xiàn)機制并未改變派生類的對象內(nèi)存布局

不過,和本文開始列出的C#靜態(tài)構造函數(shù)的幾個特點相比,本實現(xiàn)還有明顯的不足:無法通過調(diào)用類A的靜態(tài)方法觸發(fā)靜態(tài)構造函數(shù);類A的靜態(tài)構造函數(shù)必須是public的。

以上就是對C++靜態(tài)構造函數(shù)相關介紹。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容