小古銀的官方**(完整教程):
前面講了這麼多類和物件的教程,你應該也知道,類成員變數和類成員函式都是屬於物件的,不同的物件之間的成員變數會有不同的值而且成員函式也會有不同的結果,只不過類成員變數和類成員函式都寫在類裡面,算是物件們共同的規則。
而現在要講的是靜態成員變數和靜態成員函式。這些靜態成員不是屬於某個物件的,靜態成員是屬於類的,並且所有物件都可以共用這些靜態成員。
下面舉個簡單的例子:
#include class testclass
;// 定義和初始化
int testclass::m_counter = 666;
int main(void)
輸出結果:
666
1024
先從靜態成員變數的宣告和定義開始說。跟非靜態成員變數的建立不一樣,之間我教程所說的宣告,就是宣告和定義一起說了,而靜態成員變數的宣告和定義是需要分開寫的。例如上面**中的靜態成員變數m_counter
,在宣告的時候需要在前面用關鍵字static
說明它是靜態的,然後必須在全域性範圍內定義它(也就是為它分配記憶體),最好順便初始化。上面**中的int testclass::m_counter = 666;
,int
是靜態成員變數m_counter
的型別,變數名前加上testclass::
說明m_counter
是屬於類testclass
的,然後在m_counter
建立完成時給它初始化為666
。
由於靜態成員是屬於類的,所以可以直接通過類名操作靜態成員,不過通過類名操作靜態成員需要使用::
,這個跟物件不一樣。例如**中的testclass::m_counter = 1024;
可以直接通過類名操作靜態成員變數給它賦值。
#include class testclass
;int main(void)
std::cout << "5: 現在testclass類的物件數量是:" << testclass::counter() << std::endl;
return 0;
}std::size_t testclass::m_counter = 0;
testclass::testclass(void)
testclass::~testclass(void)
std::size_t testclass::counter(void)
輸出結果:
1: 現在testclass類的物件數量是:0
2: 現在testclass類的物件數量是:1
3: 現在testclass類的物件數量是:2
4: 現在testclass類的物件數量是:3
5: 現在testclass類的物件數量是:1
類成員函式都可以訪問該類的靜態成員,因為靜態成員是共用的;而類靜態成員函式只能夠訪問靜態成員,因為非靜態成員是屬於物件而不是類的。靜態函式的宣告只需要在開頭加上關鍵字static
即可,而定義跟非靜態成員函式一樣。
上面**中,當乙個物件被建立的時候,都會呼叫建構函式,而建構函式裡都會對靜態成員變數m_counter
自增;當物件釋放記憶體的時候,都會呼叫析構函式,而析構函式裡都會對靜態成員變數m_counter
自減。這樣就實現了乙個物件的計數器,可以統計現在一共建立了多少個物件。
C 入門教程
c 是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。c 擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c 就適應的問題規模而論,大小由之。c 不僅擁有計算機高效執行的實用性特徵,...
C 入門教程(五十二) 靜態陣列
小古銀的官方 完整教程 多維陣列 靜態陣列就是使用棧記憶體的陣列,一般簡稱陣列。以下是陣列的建立和簡單使用 include std cout std endl int main void 跟上面一樣,賦值符號可省略 int arr2 10 建立具有10個元素的陣列,前三個分別初始化為1,2,3,剩餘...
C 入門教程(三十一) 靜態變數
小古銀的官方 完整教程 靜態變數的應用場景並不多,但是需要用到的時候還是非常有用的。使用關鍵字static宣告的變數就是靜態變數。include std cout std endl int get count void int main void 輸出結果 123 45如果變數count不是靜態變數...