有時需要為某個類的所有物件分配乙個單一的儲存空間。在c語言中,可以用全域性變數,
但這樣很不安全。全域性資料可以被任何人修改,而且,在乙個專案中,它很容易與其他的名字
相衝突。如果可以把乙個資料當成全域性變數那樣去儲存,但又被隱藏在類的內部,並且清楚地
與這個類相聯絡,這種處理方法當然是最理想的了。
這一點可以用類的靜態資料成員來實現。類的靜態成員擁有一塊單獨的儲存區,而不管我
們建立了多少個該類的物件。所有這些物件的靜態資料成員都共享這一塊靜態儲存空間,這就
為這些物件提供了一種互相通訊的方法。但靜態資料屬於類,它的名字只在類的範圍內有效,
並且可以是p u b l i c(公有的)、p r i v a t e(私有的)或者p r o t e c t e d(保護的)。
1.定義靜態資料成員
因為類的靜態資料成員有著單一的儲存空間而不管產生了多少個物件,所以儲存空間必須
定義在乙個單一的地方。當然以前有些編譯器會分配儲存空間,但現在編譯器不會分配儲存空
間。如果乙個靜態資料成員被宣告但沒有定義時,聯結器會報告乙個錯誤。
定義必須出現在類的外部(不允許內聯)而且只能定義一次,因此它通常放在乙個類的實
現檔案中。這種規定常常讓人感到很麻煩,但實際上它是很合理的。例如
class a;
之後,在定義檔案中:
int a::i=1;
在這裡,類名和範圍分解運算子用於指定了i的範圍。
有些人對a : : i是私有的這點感到疑惑不解,還有一些事似乎被公開地處理。這不是破壞了
類結構的保護性嗎?有兩個原因可以保證它絕對的安全。第一,這些變數的初始化唯一合法是
在定義時。事實上,如果靜態資料成員是乙個帶建構函式的物件時,可以呼叫建構函式來代替
「=」操作符。第二,一旦這些資料被定義了,終端使用者就不能再定義它—否則聯結器會報告
錯誤。而且這個類的建立被迫產生這個定義,否則這些**在測試時無法連線。這就保證了定
義只出現一次並且它是由類的構造者來控制的。
2.靜態陣列的初始化
對所有的靜態資料成員,我們必須提供乙個單一的外部定義。這些定義必須有內部連線,
所以可以放在標頭檔案中。初始化靜態陣列的方法與其他集合型別的初始化一樣,但不能用自動
計數。除此之外,在類定義結束時,編譯器必須知道足夠的類資訊來建立物件,包括所有成員
的精確大小。
class values
const int values::size=100;
const float values::table[4]=;
3.區域性類中不能有靜態資料成員
區域性類是在函式內部定義的類,其中不能有靜態資料成員
4.靜態成員函式
像靜態資料成員一樣,我們也可以建立乙個靜態成員函式,它為類的全體服務而不是為一
個類的部分物件服務。這樣就不需要定義乙個全域性函式,減少了全域性或區域性名字空間的占用,
把這個函式移到了類的內部。當產生乙個靜態成員函式時,也就表達了與乙個特定類的聯絡。
靜態成員函式不能訪問一般的資料成員,它只能訪問靜態資料成員,也只能呼叫其他的靜
態成員函式。通常,當前物件的位址( t h i s)是被隱含地傳遞到被呼叫的函式的。但乙個靜態
成員函式沒有t h i s,所以它無法訪問一般的成員函式。這樣使用靜態成員函式在速度上可以比
全域性函式有少許的增長,它不僅沒有傳遞t h i s所需的額外的花費,而且還有使函式在類內的好
處。用s t a t i c關鍵字指定了乙個類的所有物件占有相同的一塊儲存空間,函式可以並行使用它,
這意味著乙個區域性變數只有乙個拷貝,函式每次呼叫都使用它。
類的靜態成員函式和靜態資料成員
一 基本知識 當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用...
類的靜態成員函式和靜態資料成員
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...
類的靜態資料成員與靜態成員函式
1 有時候類需要它的一些成員與類本身直接相關,而不是與類的各個物件保持聯絡。2 靜態資料成員 靜態成員函式不與任何物件繫結在一起,靜態成員函式不包含this指標,靜態成員函式不能宣告成const,而且也不能在static函式體內使用this指標。這一限制既適用於this的顯式使用,也對呼叫非靜態成員...