类的静态数据成员
有時需要為某個類的所有對象分配一個單一的存儲空間。在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{
static int i;
public:
//
};
之后,在定義文件中:
int A::i=1;
在這里,類名和范圍分解運算符用于指定了i的范圍。
有些人對A : : i是私有的這點感到疑惑不解,還有一些事似乎被公開地處理。這不是破壞了
類結構的保護性嗎?有兩個原因可以保證它絕對的安全。第一,這些變量的初始化唯一合法是
在定義時。事實上,如果靜態數據成員是一個帶構造函數的對象時,可以調用構造函數來代替
“=”操作符。第二,一旦這些數據被定義了,終端用戶就不能再定義它—否則連接器會報告
錯誤。而且這個類的創建被迫產生這個定義,否則這些代碼在測試時無法連接。這就保證了定
義只出現一次并且它是由類的構造者來控制的。
2.靜態數組的初始化
對所有的靜態數據成員,我們必須提供一個單一的外部定義。這些定義必須有內部連接,
所以可以放在頭文件中。初始化靜態數組的方法與其他集合類型的初始化一樣,但不能用自動
計數。除此之外,在類定義結束時,編譯器必須知道足夠的類信息來創建對象,包括所有成員
的精確大小。
class Values{
static const int size;
static const float table[4];
}
const int Values::size=100;
const float Values::table[4]={1.1,1.2,1.3,1.4};
3.局部類中不能有靜態數據成員
局部類是在函數內部定義的類,其中不能有靜態數據成員
4.靜態成員函數
像靜態數據成員一樣,我們也可以創建一個靜態成員函數,它為類的全體服務而不是為一
個類的部分對象服務。這樣就不需要定義一個全局函數,減少了全局或局部名字空間的占用,
把這個函數移到了類的內部。當產生一個靜態成員函數時,也就表達了與一個特定類的聯系。
靜態成員函數不能訪問一般的數據成員,它只能訪問靜態數據成員,也只能調用其他的靜
態成員函數。通常,當前對象的地址( t h i s)是被隱含地傳遞到被調用的函數的。但一個靜態
成員函數沒有t h i s,所以它無法訪問一般的成員函數。這樣使用靜態成員函數在速度上可以比
全局函數有少許的增長,它不僅沒有傳遞t h i s所需的額外的花費,而且還有使函數在類內的好
處。
用s t a t i c關鍵字指定了一個類的所有對象占有相同的一塊存儲空間,函數可以并行使用它,
這意味著一個局部變量只有一個拷貝,函數每次調用都使用它。
轉載于:https://www.cnblogs.com/dyllove98/p/3172133.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 分支限界
- 下一篇: 通过NAT转发实现私网对外发布信息