日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
談C#與C++在靜態(tài)構(gòu)造函數(shù)上的區(qū)別

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

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括樂至網(wǎng)站建設(shè)、樂至網(wǎng)站制作、樂至網(wǎng)頁制作以及樂至網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,樂至網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到樂至省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

下面是MSDN對(duì)靜態(tài)構(gòu)造函數(shù)特點(diǎn)的描述:

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

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

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

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

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

 
 
 
  1. class A : static_constructable  
  2. {  
  3. public:  
  4. static void static_constructor() {  
  5. std::cout << “static constructor a” << std::endl;  
  6. s_string = “abc”; //初始化靜態(tài)數(shù)據(jù)  
  7. }  
  8. static std::string s_string;  
  9. public:  
  10. A(){  
  11. std::cout << “constructor a” << std::endl;  
  12. }  
  13. private:  
  14. int m_i;  
  15. };  
  16. std::string A::s_string;  
  17. int _tmain(int argc, _TCHAR* argv[]){  
  18. std::cout << “beginning of main” << std::endl;  
  19. assert(sizeof(A) == sizeof(int));//繼承不改變A的內(nèi)存布局  
  20. assert(A::s_string == ““);  
  21. A a1;  
  22. assert(A::s_string == “abc”);  
  23. A a2;  
  24. std::cout << “end of main” << std::endl;  
  25. return 0;  

輸出:

 
 
 
  1. beginning of main  
  2. static constructor a //創(chuàng)建A對(duì)象前自動(dòng)調(diào)用靜態(tài)構(gòu)造方法,一次且僅一次  
  3. constructor a  
  4. constructor a  
  5. end of main 

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

 
 
 
  1. template  
  2. class static_constructable  
  3. {  
  4. private:  
  5. struct helper{  
  6. helper(){  
  7. T::static_constructor();  
  8. }  
  9. };  
  10. protected:  
  11. static_constructable(){  
  12. static helper placeholder;  
  13. }  
  14. }; 

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

static_constructor類模板簡單地模擬了C#的靜態(tài)構(gòu)造函數(shù)機(jī)制,它具有以下特點(diǎn):

1. 在***次構(gòu)造類對(duì)象之前自動(dòng)調(diào)用類提供的靜態(tài)構(gòu)造函數(shù)

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

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

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

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

【編輯推薦】

  1. C#初學(xué)者對(duì)Equals方法的幾個(gè)常見誤解
  2. c#.net實(shí)體類序列化方法
  3. 深入C# 序列化(Serialize)、反序列化(Deserialize)
  4. C#中自增、自減操作符重載是個(gè)怎么回事兒
  5. C#中的閉包是怎么捕獲變量的

網(wǎng)頁標(biāo)題:談C#與C++在靜態(tài)構(gòu)造函數(shù)上的區(qū)別
新聞來源:
http://www.5511xx.com/article/dhsojjj.html