標籤:
一.什麼是static類成員
對於特定類類型的全體對象而言, 訪問一個全域對象有時是必要的. 然後,全域對象會破壞封裝: 對象需要支援特定類抽象的實現. 如果對象是全域的, 一般的使用者代碼就可以修改這個值. 類可以定義類靜態成員,而不是定義一個可普遍訪問的全域對象. 通常, 非static資料成員存在於類類型的每個對象中. 不像普通的資料成員, static資料成員獨立於該類的任意對象而存在, 每個static資料成員是與類關聯的對象, 並不與該類的對象相關聯.
類也可以定義static成員函數. static成員函數沒有this形參 (static成員是類的組成部分但不是任何對象的組成部分) , 它可以直接存取所屬類的static成員, 但不能直接使用非static成員.
二.使用類的static成員的優點
1)static成員的名字是在類的範圍中, 因此可以避免與其他類的成員或全域對象名字衝突.
2)可以實施封裝.static成員可以是私人成員,而全域對象不可以.
3)通過閱讀程式容易看出static成員是與特定類關聯的.這種可見度可清晰地顯示程式員的意圖.
三.定義static成員
在成員聲明前加上關鍵字static將成員設為static. static成員遵循正常的公有/私人訪問規則.
<span style="font-size:14px;">class A{ public: static int Getval() { return value;} static void Setval( int ); private: static int value;} int A::value=0; //初始化</span>
四.使用類的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 資料成員就可以在類的定義體中進行初始化:
<span style="font-size:14px;">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; //初始化</span>
<span style="font-size:14px;"> const int A:: num;</span>
const static 資料成員在類的定義體中初始化時, 該資料成員仍必須在類的定義體之外進行定義.
2) static 成員不是類對象的組成部分
static 成員獨立於任何對象而存在, 不是類類型對象的組成部分. 它們的使用方式對於非static資料成員而言是不合法的.
例如static 資料成員的類型可以是該成員所屬的類類型. 而非static成員被限定聲明為其自身類對象的指標或引用.
class C
{
private:
static C tmp; //ok
C tmp; //wrong
};
除了static資料成員還有一個比較特殊的是mutable成員, mutable成員的用法也是在類型名前面加上mutable, mutable成員永遠不能為const, 它的值可以在const成員函數中修改.
c++ static 類成員