一、static成員變量
1.靜態成員變量的定義,與靜態類型變量的定義方式一樣,要在成員變量之前加關鍵字static。
2.不同於未初始化的靜態全局變量會被賦予默認值,靜態成員變量必須手動初始化,並且,由於它存儲在內存的靜態存儲區,故而在C++語法中靜態成員變量只能在類體外初始化。此時,前面不需要加關鍵字static。
3. 靜態成員變量屬於類而不是對象,因而它不含有隱含的*this指針參數。靜態成員變量在類定義時就被分配存儲單元,被所有對象共享,它的初始化必須在對象構造之前。
4. 靜態成員變量可看成加了訪問權限控制的全局變量。它的初始化方式都一樣,只是公有、私有和受保護的靜態成員訪問權限不同而已。公有靜態成員,既可以通過類的對象進行訪問,也可以通過類名直接訪問;私有的和保護的靜態成員變量則只能被該類的公有成員函數和友元函數訪問。
5. 父類的static變量和函數在派生類中依然可用,但是受訪問性控制。對static變量來說,派生類和父類中的static變量是共用空間的,這點在進行引用計數的時候要特別注意。
二、static成員函數
1. 靜態成員函數的定義與非靜態成員函數的定義的區別在於要在成員變量之前加關鍵字static。
2. const修飾的成員函數本質上是一個加上了訪問控制的全局函數。它屬於類本身,可被所有的對象訪問。由於函數不隱含this指針參數,因而函數不能訪問非靜態成員,只能訪問類的靜態的成員、全局變量、外部函數和變量等。
3. 靜態成員函數若想訪問類的非靜態成員需要藉助實例化的對象或指針。
4. 靜態成員函數首先是一個成員函數,它可以定義爲內聯函數,也可以在類體外定義,但此時函數名前不必加關鍵字static。
5. const修飾符用於表示函數不能修改成員變量的值,該函數必須是含有this指針的類成員函數,函數調用方式爲thiscall,而static成員函數本質上是全局函數,調用規約是__cdecl或__stdcall。因而不能用const來修飾static成員函數。
6. static成員函數是沒有“虛函數”一說的。因爲全局函數不存在虛函數。