C++分析講解類的靜態(tài)成員函數(shù)如何使用
一、未完成的需求
- 統(tǒng)計在程序運(yùn)行期間某個類的對象數(shù)目
- 保證程序的安全性(不能使用全局變量)
- 隨時可以獲取當(dāng)前對象的數(shù)目
在C++分析講解類的靜態(tài)成員變量是什么中每次打印對象的個數(shù)時,都需要依賴于一個對象名,下面看一個代碼:
#include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", gTest.getCount); return 0; }
按理說 count 應(yīng)該輸出為 0,但是 gTest 對象沒有定義,所以編譯就會報錯:
有沒有什么解決辦法呢?下面再看一段代碼:
#include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::cCount); Test::cCount = 1000; printf("count = %d\n", Test::cCount); return 0; }
輸出結(jié)果如下,Test::cCount = 1000; 可以認(rèn)為是意外導(dǎo)致這個賦值,這樣別人就會誤認(rèn)為這里面有 1000 個對象,這是不對的。
直接通過類名訪問成員變量也是不可取的,安全性會打折扣。
那到底該怎么做呢?且看下面。
二、問題分析
需要做的事情
- 不依賴對象就可以訪問靜態(tài)成員變量
- 必須保證靜態(tài)成員變量的安全性
- 方便快捷的獲取靜態(tài)成員變量的值
三、靜態(tài)成員函數(shù)
在 C++ 中可以定義靜態(tài)成員函數(shù)
- 靜態(tài)成員函數(shù)是類中特殊的成員函數(shù)
- 靜態(tài)成員函數(shù)屬于整個類所有
- 可以通過類名直接訪問公有靜態(tài)成員函數(shù)
- 可以通過對象名訪問公有靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)的定義
直接通過 static 關(guān)鍵字修飾成員函數(shù)
下面看一個靜態(tài)成員函數(shù)示例:
#include <stdio.h> class Demo { private: int i; public: int getI(); static void StaticFunc(const char* s); static void StaticSetI(Demo& d, int v); }; int Demo::getI() { return i; } void Demo::StaticFunc(const char* s) { printf("StaticFunc: %s\n", s); } void Demo::StaticSetI(Demo& d, int v) { d.i = v; } int main() { Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(d, 10); printf("d.i = %d\n", d.getI()); Demo::StaticFunc("main End..."); return 0; }
輸出結(jié)果如下:
當(dāng)然,把Demo::StaticSetI(d, 10); 換成 d.StaticSetI(d, 10); 也是可以的哈,對應(yīng)于前面講的可以通過類名直接訪問公有靜態(tài)成員函數(shù),也可以通過對象名訪問公有靜態(tài)成員函數(shù)。
如果把void Demo::StaticSetI(Demo& d, int v) 這里變成:
void Demo::StaticSetI(int v) { i = v; }
編譯器就會報錯:
這是因?yàn)殪o態(tài)成員函數(shù)不能直接訪問成員變量,可以通過對象名訪問公有靜態(tài)成員函數(shù)。
靜態(tài)成員函數(shù) vs 普通成員函數(shù)
靜態(tài)成員函數(shù) | 普通成員函數(shù) | |
所有對象共享 | Yes | Yes |
隱含 this 指針 | No | Yes |
訪問普通成員變量(函數(shù)) | No | Yes |
訪問靜態(tài)成員變量(函數(shù)) | Yes | Yes |
通過類名直接調(diào)用 | Yes | No |
通過對象名直接調(diào)用 | Yes | Yes |
所以,滿足 1. 統(tǒng)計在程序運(yùn)行期間某個類的對象數(shù)目 2.保證程序的安全性(不能使用全局變量) 3.隨時可以獲取當(dāng)前對象的數(shù)目的最終解決方案如下:
#include <stdio.h> class Test { private: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } static int GetCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::GetCount()); Test t1; Test t2; printf("count = %d\n", t1.GetCount()); printf("count = %d\n", t2.GetCount()); Test* pt = new Test(); printf("count = %d\n", pt->GetCount()); delete pt; printf("count = %d\n", Test::GetCount()); return 0; }
輸出結(jié)果如下:
四、小結(jié)
- 靜態(tài)成員函數(shù)是類中特殊的成員
- 函數(shù)靜態(tài)成員函數(shù)沒有隱藏的 this 參數(shù)
- 靜態(tài)成員函數(shù)可以通過類名直接訪問
- 靜態(tài)成員函數(shù)只能直接訪問靜態(tài)成員變量(函數(shù))
到此這篇關(guān)于C++分析講解類的靜態(tài)成員函數(shù)如何使用的文章就介紹到這了,更多相關(guān)C++靜態(tài)成員函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn)
這篇文章主要介紹了C++20中的協(xié)程(Coroutine)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C++智能指針shared_ptr與weak_ptr的實(shí)現(xiàn)分析
shared_ptr是一個標(biāo)準(zhǔn)的共享所有權(quán)的智能指針,允許多個指針指向同一個對象,定義在 memory 文件中,命名空間為 std,這篇文章主要介紹了C++ 中 shared_ptr weak_ptr,需要的朋友可以參考下2022-09-09結(jié)構(gòu)體對齊的規(guī)則詳解及C++代碼驗(yàn)證
在c語言的結(jié)構(gòu)體里面一般會按照某種規(guī)則去進(jìn)行字節(jié)對齊。本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解下2021-08-08