一.什麼是static類成員
對於特定類類型的全體對象而言, 訪問一個全局對象有時是必要的. 然後,全局對象會破壞封裝: 對象需要支持特定類抽象的實現. 如果對象是全局的, 一般的用戶代碼就可以修改這個值. 類可以定義類靜態成員,而不是定義一個可普遍訪問的全局對象. 通常, 非static數據成員存在於類類型的每個對象中. 不像普通的數據成員, static數據成員獨立於該類的任意對象而存在, 每個static數據成員是與類關聯的對象, 並不與該類的對象相關聯.
類也可以定義static成員函數. static成員函數沒有this形參 (static成員是類的組成部分但不是任何對象的組成部分) , 它可以直接訪問所屬類的static成員, 但不能直接使用非static成員.
二.使用類的static成員的優點
1)static成員的名字是在類的作用域中, 因此可以避免與其他類的成員或全局對象名字沖突.
2)可以實施封裝.static成員可以是私有成員,而全局對象不可以.
3)通過閱讀程序容易看出static成員是與特定類關聯的.這種可見性可清晰地顯示程序員的意圖.
三.定義static成員
在成員聲明前加上關鍵字static將成員設為static. static成員遵循正常的公有/私有訪問規則.
class A { public: static int Getval() { return value;} static void Setval( int ); private: static int value; } int A::value=0; //初始化
四.使用類的static成員
可以通過作用域操作符從類直接調用static成員, 或者通過對象,引用,或指向該類類型的對象的指針間接調用.
A pg;
A *pg1=&pg;
int B;
B=pg.Getval();
B=pg1->Getval();
B=A::Getval();
五.類的成員函數
當static成員函數定義在類的外部時, 無須重復指定static關鍵字, 該保留字只出現在類定義內部的聲明處:
void A:: Setval( int newVal)
{
value=newVal;
}
static成員不是任何對象的組成部分, 所以static成員函數不能聲明為const, 畢竟, 將成員函數聲明為const就是承諾不會修改該函數所屬的對象. static成員函數也不能聲明為虛函數.
六.static數據成員
static數據成員可以聲明為任意類型: 常量, 引用, 數組, 類類型, 等等.
static數據成員必須在類定義的外部定義(正好一次), 不像普通數據成員, static成員不是通過類構造函數進行初始化, 而是應該在定義時進行初始化.
定義方式如下:
先指定類型名, 接著是成員的完全限定名
int A::value=0; //初始化
1)特殊的整型const static 成員
一般而言static成員像普通數據成員一樣不能在類的定義體中初始化. 但有一個例外, 那就是只要初始化是一個常量表達式, 整型const static 數據成員就可以在類的定義體中進行初始化:
class A { public: static int Getval() { return value;} static void Setval( int ); private: static const int num = 10; int Sz[num]; static int value; } int A::value=0; //初始化
const int A:: num;
const static 數據成員在類的定義體中初始化時, 該數據成員仍必須在類的定義體之外進行定義.
2) static 成員不是類對象的組成部分
static 成員獨立於任何對象而存在, 不是類類型對象的組成部分. 它們的使用方式對於非static數據成員而言是不合法的.
例如static 數據成員的類型可以是該成員所屬的類類型. 而非static成員被限定聲明為其自身類對象的指針或引用.
class C
{
private:
static C tmp; //ok
C tmp; //wrong
};