成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C#與C++在靜態(tài)構(gòu)造函數(shù)上的異同

開發(fā) 后端
本文將對(duì)比的是C#與C++在靜態(tài)構(gòu)造函數(shù)上的異同,希望通過本文能讓大家對(duì)C#與C++的不同點(diǎn)有所了解。

這里我們將討論的是C#與C++在靜態(tài)構(gòu)造函數(shù)上的異同,通過這一關(guān)鍵點(diǎn),希望能讓大家更好的了解C#與C++,也對(duì)大家今后的工作有所幫助。

#T#

在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)用一次,不存在多線程問題)。

下面是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.無(wú)法直接調(diào)用靜態(tài)構(gòu)造函數(shù)

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

C++語(yǔ)言規(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<A>模版類,并提供 static void statici_constructor()靜態(tài)方法即可:

  1. class A : static_constructable<A>  
  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.  
  9.     static std::string s_string;  
  10.  
  11. public:  
  12.     A(){  
  13.         std::cout << "constructor a" << std::endl;  
  14.     }  
  15.  
  16. private:  
  17.     int m_i;  
  18. };  
  19.  
  20. std::string A::s_string;  
  21.  
  22. int _tmain(int argc, _TCHAR* argv[]){  
  23.     std::cout << "beginning of main" << std::endl;  
  24.  
  25.     assert(sizeof(A) == sizeof(int));//繼承不改變A的內(nèi)存布局  
  26.     assert(A::s_string == "");  
  27.     A a1;  
  28.     assert(A::s_string == "abc");  
  29.     A a2;  
  30.     std::cout << "end of main" << std::endl;  
  31.  
  32.     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<typename T>  
  2. class static_constructable  
  3. {  
  4. private:  
  5.     struct helper{  
  6.         helper(){  
  7.             T::static_constructor();  
  8.         }  
  9.     };  
  10.  
  11. protected:  
  12.     static_constructable(){  
  13.         static helper placeholder;      
  14.     }  
  15. };  

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

static_constructor類模板簡(jiǎn)單地模擬了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)還有明顯的不足:無(wú)法通過調(diào)用類A的靜態(tài)方法觸發(fā)靜態(tài)構(gòu)造函數(shù);類A的靜態(tài)構(gòu)造函數(shù)必須是public的。希望有更好解決方案的朋友不吝賜教,也歡迎對(duì)此話題感興趣的朋友交流探討!

原文標(biāo)題:C# vs C++之三:靜態(tài)構(gòu)造函數(shù)

鏈接:http://www.cnblogs.com/weidagang2046/archive/2009/11/14/1602463.html

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2011-06-11 21:36:44

C#C++

2011-06-14 12:27:38

C#C++

2009-07-31 15:44:02

C#靜態(tài)構(gòu)造函數(shù)

2009-08-13 17:30:30

C#構(gòu)造函數(shù)

2009-08-13 18:02:11

C#靜態(tài)構(gòu)造函數(shù)

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2009-08-13 17:38:42

C#構(gòu)造函數(shù)

2009-08-14 09:15:28

C#調(diào)用構(gòu)造函數(shù)

2009-08-13 18:10:31

C#靜態(tài)構(gòu)造函數(shù)

2009-08-20 14:28:00

C#靜態(tài)構(gòu)造函數(shù)

2009-07-31 15:37:45

C#靜態(tài)構(gòu)造函數(shù)

2009-08-13 18:15:06

C#繼承構(gòu)造函數(shù)

2009-08-14 09:43:59

C#復(fù)制構(gòu)造函數(shù)

2009-09-18 09:02:45

CLR Via C#

2009-08-14 09:58:09

C#復(fù)制構(gòu)造函數(shù)

2010-01-21 14:28:03

C++靜態(tài)成員函數(shù)

2010-01-27 16:10:32

C++靜態(tài)構(gòu)造函數(shù)

2010-01-22 11:13:16

C++靜態(tài)

2009-08-13 13:42:54

C#構(gòu)造函數(shù)

2024-12-31 00:07:12

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产日韩欧美电影 | 色吧久久 | 国产成人免费视频网站高清观看视频 | 6080yy精品一区二区三区 | cao在线| 91在线精品一区二区 | 日韩欧美三级电影在线观看 | 精品视频一区二区 | 国产精品美女在线观看 | 国产大毛片 | 正在播放国产精品 | 国产成人高清在线观看 | 午夜寂寞福利视频 | 久久亚洲欧美日韩精品专区 | 热99在线 | 一级欧美视频 | 欧美日韩在线视频一区 | 91一区二区三区 | 久久国内精品 | 精品综合久久 | 国产蜜臀| 91 久久 | 亚洲免费久久久 | 国产成人综合久久 | 男女激情网| 国产美女一区二区三区 | 久久精品国产一区二区三区 | 欧美一区二区三区久久精品 | 精品无码久久久久久久动漫 | 中文字幕三区 | 在线视频一区二区 | 亚洲精品女优 | 久久久国产一区二区三区四区小说 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲欧美中文日韩在线v日本 | 日韩久久中文字幕 | 亚洲国产欧美国产综合一区 | 国产精品99久久久久久人 | 亚洲性视频在线 | 在线观看免费福利 | 亚洲成人一区 |