2011-10-01 116 views
3

我有一堆函數,我想放在一個單獨的命名空間或類。在兩個之中,哪個更好?如果是後者,我應該怎麼做呢?我的意思是,我沒有任何實例成員,所以我應該指定構造函數爲private?或刪除它?C++靜態類

無論哪種方式,它會是這個樣子,給你一個想法:

myproject::foo::f() 

回答

11

C++的命名空間和類可以同時包含的功能和其他類型的,但也有一些行爲的關鍵區別。你必須決定哪個最適合你的特殊情況。

  • 類可以模板化,名稱空間不能。這提供了將一組模板參數傳遞給一組函數和其他類型的方法。結合typedef,這可以非常強大。

  • 您可以使用using namespace xyz;將一組名稱空間成員放入任何範圍。類可以被繼承以使它們進入範圍(如果沒有實例成員,由於空的基本優化,但靜態成員可以在沒有限定的情況下使用,效果不會太大),但這隻適用於其他類。免費功能必須明確限定對班級成員的所有訪問權限。

  • 命名空間參與參數相關的查找,父類的成員不參與。

如果你想使用繼承一個類來提供模板參數,並獲得其靜態成員不合格訪問的伎倆,那麼你就應該離開的構造函數和析構函數的默認和瑣碎,而不是刪除或使他們無法訪問。在C++ 11中,您可以將構造函數標記爲protected和defaulted。

+0

+1對於這個看似簡單的問題的這個令人驚訝的深度答案 –

+0

@KerrekSB:這些想法中的很多都是在C#中爲靜態使用構造遊說時開發的。 –

+0

謝謝。我不需要任何使用類的優點,所以我只是使用一個名稱空間。 – someguy

1

如果使用該類,最好聲明默認構造函數,複製構造函數,賦值運算符和析構函數的私有/未實現(可能還有一些C++ 11)。如果你沒有,你會有一個可以用來製造無用物體的類。如果您使用命名空間,則不必執行任何操作。

類是爲物體制作的。使用它們作爲靜態函數的容器,沒有成員數據,比濫用更多的是濫用。