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

淺析C#與C++在靜態構造函數上的異同

開發 后端
本文主要介紹的是C#和C++在靜態構造函數上的相同點和不同點。靜態構造函數用于初始化任何靜態數據,或用于執行僅需執行一次的特定操作。在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數。一起來看。

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

下面是MSDN對靜態構造函數特點的描述:

1.靜態構造函數既沒有訪問修飾符,也沒有參數

2.在創建***個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類

3.無法直接調用靜態構造函數

4.在程序中,用戶無法控制何時執行靜態構造函數

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

  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”; //初始化靜態數據  
  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的內存布局  
  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 //創建A對象前自動調用靜態構造方法,一次且僅一次  
  3. constructor a  
  4. constructor a  
  5. end of main 

下面是static_constructable類模板的實現:

  1. template<typename T>  
  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. }; 

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

static_constructor類模板簡單地模擬了C#的靜態構造函數機制,它具有以下特點:

1. 在***次構造類對象之前自動調用類提供的靜態構造函數

2. 靜態構造函數被調用的時機是確定的

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

4. 基于繼承的實現機制并未改變派生類的對象內存布局

不過,和本文開始列出的C#靜態構造函數的幾個特點相比,本實現還有明顯的不足:無法通過調用類A的靜態方法觸發靜態構造函數;類A的靜態構造函數必須是public的。

【編輯推薦】

  1. Visual C++中實現對圖像數據的讀取顯示
  2. 淺談怎樣加快C++代碼的編譯速度
  3. C++和Java 的缺省初始化問題
  4. C++中基類對象安全轉換為派生類對象的方法
  5. C++設計目標及原則

 

責任編輯:于鐵 來源: IT168網站
相關推薦

2009-11-17 09:07:55

靜態構造函數

2011-06-14 12:27:38

C#C++

2009-07-31 15:44:02

C#靜態構造函數

2009-08-13 17:30:30

C#構造函數

2009-08-13 18:02:11

C#靜態構造函數

2010-01-27 17:16:52

C++構造函數

2009-08-14 09:15:28

C#調用構造函數

2009-08-13 17:38:42

C#構造函數

2009-08-13 18:10:31

C#靜態構造函數

2009-08-20 14:28:00

C#靜態構造函數

2009-07-31 15:37:45

C#靜態構造函數

2009-09-18 09:02:45

CLR Via C#

2009-08-13 18:15:06

C#繼承構造函數

2009-08-14 09:58:09

C#復制構造函數

2009-08-14 09:43:59

C#復制構造函數

2010-01-21 14:28:03

C++靜態成員函數

2010-01-27 16:10:32

C++靜態構造函數

2010-01-22 11:13:16

C++靜態

2009-08-13 13:42:54

C#構造函數

2024-12-31 00:07:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频在线看 | 精品综合久久久 | 在线国产中文字幕 | 成人免费视频 | 成人免费视频 | 日本 欧美 国产 | 日韩伦理一区二区三区 | 色资源在线 | 亚洲字幕在线观看 | 亚洲第一av | av毛片在线播放 | 老外黄色一级片 | 国产精品久久久久久久久大全 | 国产精品美女久久久久久免费 | 99九色| 在线中文字幕日韩 | 久久久av | 欧美黄在线观看 | 日韩午夜网站 | 国产精品日韩欧美一区二区三区 | 亚洲aⅴ | 黄色一级电影免费观看 | 欧美综合一区二区三区 | 亚洲精品国产电影 | 色综合久久久 | 欧美日韩免费一区二区三区 | 成人毛片视频在线播放 | 亚洲一区二区视频在线观看 | 亚洲欧美综合精品久久成人 | 欧美一区二区 | 亚洲品质自拍视频网站 | jlzzjlzz国产精品久久 | 久久久亚洲精品视频 | 欧美黑人国产人伦爽爽爽 | 日韩精品一区二区三区高清免费 | 日韩成人在线视频 | 国产婷婷精品 | 99热这里都是精品 | 国产精品视频一区二区三区 | 成人在线免费观看 | 男女免费在线观看视频 |