1. 程式人生 > >關於c++靜態類的說法

關於c++靜態類的說法

看了網上的觀點,大致有這幾種比較好的。

觀點一:根據現代的C++觀點,靜態類沒有必要存在於C++中。

一個類是對一個概念的描述,類的本質是它維護了一個不變式,也就是說它有一個狀態,它所有的介面都是為了訪問或者獲取這個狀態以及跟狀態相關的操作。一個靜態類沒有狀態,因此就沒有必要成為一個類。在C++中靜態方法不如非靜態非類的成員方法好,尤其是使用了模板的情況下。

我的疑問:如果只宣告類起顯示作用呢?

觀點二:C++裡不可能有靜態類的說法,相反,在Java裡倒是有這麼一說。
C++由於具有傳值、傳址、啞元功能,使用靜態類不僅多餘而且也完全沒有必要,相反,對Java、C#之類“改進型語言”來說,由於為避免指標,防止過多的產生物件例項,就必須額外的引入一些新的“先進性”的東西,比如靜態類。然而,靜態類本身是一個半成品(或是終極產品),由於其無法繼承,靜態類的產品化會因為不便升級而成為一種垃圾。


同樣,即便是在Java裡,靜態類的作用也僅相當於包含靜態例項的C++型別定義,然而從語義上還沒有C++定義的直觀,為了對付一個小小的指標,避免偽引用,有必要做這麼大的動作嗎?我對此感到不值。

觀點三:C#或Java的
類可以宣告為 static 的,以指示它僅包含靜態成員。不能使用 new 關鍵字建立靜態類的例項。靜態類在載入包含該類的程式或名稱空間時由 .NET Framework 公共語言執行庫 (CLR;特指:C#語言) 自動載入。 
靜態類只用於包含靜態成員的型別,它既不能例項化,靜態類的特性是防止繼承,防止外部來NEW。
所以C++中不存在靜態類
觀點四:使用靜態類來包含不與特定物件關聯的方法。
例如,建立一組不操作例項資料
並且不與程式碼中的特定物件關聯方法是很常見的要求。您應該使用靜態類來包含那些方法。

靜態類的主要功能如下:
    它們僅包含靜態成員。(僅包含靜態成員不是上面說的包含不操作例項資料,不與物件關聯矛盾嗎?)
    它們不能被例項化。
    它們是密封的。
    它們不能包含例項建構函式(C# 程式設計指南)。
    靜態類不能使用abstract或sealed修飾符。
    靜態類預設繼承自System.Object根類,不能顯式指定任何其他基類。
    靜態類不能指定任何介面實現(不能有介面實現,那起什麼作用)。
    靜態類的成員不能有protected或protected internal訪問保護修飾符。
觀點五:

靜態類和類成員用於建立無需建立類的例項就能夠訪問的資料和函式。靜態類成員可用於分離獨立於任何物件標識的資料和行為:無論物件發生什麼更改,這些資料和函式都不會隨之變化。當類中沒有依賴物件標識的資料或行為時,就可以使用靜態類。

結論:

當一個類完全脫離例項資料和物件時可以使用靜態類。

靜態類可以有自己的成員變數和成員函式,但都必須是靜態的。對靜態成員變數只能是程式執行開始時初始化,不能在類內初始化。

靜態類沒有基類。