2016-01-12 54 views
2

創建一個所有成員(屬性,函數)都是靜態類的(客觀)缺點是什麼?特別是與使用命名空間相比?或者你更願意創建全局變量/函數?現代C++中的全局變量

我喜歡創建靜態屬性,因爲我發現它們「更整潔」。 (我確切地知道他們來自哪裏,等等)。我對命名空間不是很熟悉。而且我對全局變量不滿意,因爲我對C關鍵字不是很熟悉,如externstatic

此外,如果我們考慮類

class MyStaticClass 
{ 
    private: 

     static int x; 
     static double y; 

    public: 

     static float s; 
     static double weatherForecast(unsigned int, char); 
}; 

和命名空間

namespace MyNamespace 
{ 
    int x; 
    double y; 
    float s; 
    double weatherForecast(unsigned int, char); 
} 
  1. 是否有打電話MyStaticClass::weatherForecast並呼籲MyNamespace::weatherForecast之間的差異(性能明智)?

  2. 閱讀/書寫MyStaticClass::s與閱讀/書寫MyNamespace::s之間是否存在差異(表現方面)?

  3. 如果使用類而不是主類型,上述問題的答案是否會發生變化?

+3

_「或者你願意創建一個命名空間嗎?」_我認爲這是今天公認的最佳做法。但這可能只是一個意見。 –

+2

你爲什麼需要它們?一組常量? + https://isocpp.org/wiki/faq/coding-standards#global-vars –

+0

https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables,這可能是有用的。 – 88877

回答

8

它是「良好做法」創建一個類,所有成員(屬性,方法)是靜態的?

這被稱爲「monostate」,它取決於。

或者你更願意創建一個名稱空間?

具有靜態函數的類可以是模板參數,而命名空間不能。另一方面,名稱空間允許依賴於參數的查找,而類 - 不太如此。

或者你願意創建全局變量/函數嗎?

有些事情是真正的全局性的,就像標準流,Logger對象,事件循環引擎(線程特定的全局)。例如,在每次調用中傳遞Logger對象或將它們存儲爲成員變量的代碼比IMO所需的要複雜得多。

有一個經常被人引用的誤解,認爲翻譯單元的動態初始化順序是不確定的,所以人們過度使用單例而不是普通的全局變量來確保Singleton對象在第一次使用之前被初始化。但是,有一種稱爲Schwarz Counter的便攜式技術,用於初始化標準流(std::cout和朋友),它確保在輸入main之前首次使用這些全局變量。


回答您的更新問題:不,不,不。

+1

特別滿意syngleton的揭穿。 – SergeyA

+0

你好,謝謝你的回答。我更新了原文,並列出了更多精確的問題。 @MSalters – Pippin

+0

我最近讀到,實際上,在某些情況下,施瓦茨計數器是一種皺眉般的技術。例如,在LLVM項目編碼標準http://llvm.org/docs/CodingStandards.html中,他們寫道:「禁止在庫文件中使用#include ,因爲許多常見實現在每個翻譯中都透明地注入靜態構造函數包括它的單位。「問題是,對於鏈接到llvm的每個程序,所有這些靜態init都會導致可衡量的和不必要的程序啓動成本。 –