靜態成員

靜態成員

靜態成員,指的是在c++類中聲明成員時可以加上static關鍵字,這樣聲明的成員就叫做靜態成員(包括數據成員和成員函數)。即聲明為static的類成員或者成員函數便能在類的範圍內同享。

基本介紹


在c++類中聲明成員時可以加上static關鍵字,這樣聲明的成員就叫做靜態成員(包括數據成員和成員函數)。例如:

區別對比


靜態數據成員和普通數據成員區別較大,體現在下面幾點:
(1)普通數據成員屬於類的一個具體的對象,只有對象被創建了,普通數據成員才會被分配內存。而靜態數據成員屬於整個類,即使沒有任何對象創建,類的靜態數據成員變數也存在。
(2)因為類的靜態數據成員的存在不依賴與於任何類對象的存在,類的靜態數據成員應該在代碼中被顯式地初始化,一般要在類外進行,例如上例。在C++11標準中,我們可以為靜態成員提供const整數類型的類內初始值,不過要求靜態成員必須是字面值常量類型的constexpr(源自C++Primer中文版270頁)。
(3)外部訪問類的靜態成員能直接通過類名來訪問,例如:test::getCount()。雖然靜態成員不屬於類的某個對象,但是我們仍然可以使用類的對象、引用或指針來訪問靜態成員(源自C++Primer中文版269頁),例如:
test ac1,*ac2;
int r;
r=ac1.getCount();// 或者 r=ac2->getCount();
(4)類的靜態成員函數無法直接訪問普通數據成員(可以通過對象名間接的訪問),而類的任何成員函數都可以訪問類的靜態數據成員。
(5)靜態成員和類的普通成員一樣,也具有public、protected、private3種訪問級別,也可以具有返回值、const修飾符等參數。
應用舉例:
汽車製造商為統計汽車的產量,可以在在汽車類--car類中增加用於計數的靜態數據成員變數,比如在某個類car中聲明一個static int number;初始化為0。這個number就能被所有car的實例共用。在car類的構造函數里加上number++,在car類的析構函數里加上number--。那麼每生成一個car的實例,number就加一,每銷毀一個car的實例(汽車報廢),number就減一,這樣,number就可以記錄在市場上car的實例個數。