注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:9.2.0
一、未完成的需求
1)統計在程式執行期間某個類的物件數目
2)保證程式的安全性(不能使用全域性變數)
3)隨時可以獲取當前物件的數目(failure)
程式設計實驗
解決方案的嘗試
26-1.cpp
#include class test
~test()
int getcount()
};int test::ccount = 0;
int main()
操作:
1) g++ 26-1.cpp -o 26-1.out編譯正確,列印結果:
count = 0
count = 1000
分析:
如果靜態變數定義為共有的,可以通過類名直接訪問資料,是很不安全的做法。
二、問題分析
1) 我們需要什麼?
- 不依賴物件就可以訪問靜態成員變數
- 必須保證靜態成員變數的安全性
- 方便快捷的獲取靜態成員變數的值
三、靜態成員函式(防止破壞資料安全性,這樣只能直接訪問函式而不是資料)
1) 在c++中可以定義靜態成員函式
- 靜態成員函式是類中特殊的成員函式
- 靜態成員函式屬於整個類所有
- 可以通過類名直接訪問公有靜態成員函式(訪問方式)
- 可以通過物件名訪問公有靜態成員函式(訪問方式)(靜態成員函式只有這兩種方式可以訪問成員函式)
2) 靜態成員函式的定義
- 直接通過static關鍵字修飾成員函式
class test
static int func2();
}int test::func2()
程式設計實驗
靜態成員函式示例
26-2.cpp
#include class demo
;
int demo::geti()
void demo::staticfunc(const char* s)
void demo::staticseti(demo& d, int v)
int main()
操作:
1) g++ 26-2.cpp -o 26-2.out編譯正確,列印結果:
staticfunc: main begin...
d.i = 10
staticfunc: main end...
2) 通過物件名訪問公有靜態成員函式:
#include class demo
;
int demo::geti()
void demo::staticfunc(const char* s)
void demo::staticseti(demo& d, int v)
int main()
g++ 26-2.cpp -o 26-2.out編譯正確,列印結果:
staticfunc: main begin...
d.i = 10
staticfunc: main end...
staticfunc: aha
3)靜態成員函式vs普通成員函式
注意:經過測試靜態成員函式不能訪問普通成員函式和變數。
程式設計實驗
最後的解決方案
26-3.cpp
#include class test
~test()
static int getcount() //靜態成員函式
};int test::ccount = 0;
int main()
操作:
1) g++ 26-3.cpp -o 26-3.out編譯正確,列印結果:
ccount = 0
ccount = 2
ccount = 2
ccount = 3
ccount = 2
分析:
記錄類例項化物件的數目,必須將計數變數變為靜態成員變數,並且放在private下。靜態成員變數可以被普通成員函式或者靜態成員函式訪問,這點對於兩種成員函式無差別。不過,靜態成員函式可以通過類名被訪問,這種訪問方式普通不支援,為了增加客戶使用靈活性,通過靜態成員函式獲取靜態成員變數(類例項化物件數目)使用更好一些。
1、定義靜態成員函式後(訪問了私有靜態成員變數),直接訪問私有靜態成員變數非法操作。
2、靜態成員函式可以直接訪問靜態成員變數。
小結1)靜態成員函式是類中特殊的成員函式
2)靜態成員函式沒有隱藏的this引數
3)靜態成員函式可以通過類名直接訪問
4)靜態成員函式只能直接訪問靜態成員變數(函式)
C 第26課 類的靜態成員函式
本文學習自 狄泰軟體學院 唐佐林老師的 c 課程 總結說明 靜態成員變數的意義 為什麼要有靜態成員變數 是因為 成員變數都是每個物件專屬的,但是所有類共享乙個變數的話,就要用靜態成員變數 靜態成員函式的意義 靜態成員函式的意義是 如果沒有物件存在的時候,也可以訪問靜態成員變數。靜態成員函式也是公有的...
類靜態成員和類靜態成員函式
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...
第26課 靜態成員函式
未完成的需求 統計在程式執行期間某個類的物件數目 保證程式的安全性 不能使用全域性變數 隨時可以獲取當前物件的數目 failure 假設程式中沒有test物件,你就無法獲取當前物件的數目。因為在上乙個程式中是使用物件去呼叫成員函式的,此時如果沒有物件,如何去呼叫呢?解決方案1 include cla...