【C++深度剖析教程3】C++中类的静态成员变量
- 學(xué)習(xí)交流加(可免費(fèi)幫忙下載CSDN資源):
- 個(gè)人微信: liu1126137994
- 學(xué)習(xí)交流資源分享qq群1(已滿): 962535112
- 學(xué)習(xí)交流資源分享qq群2: 780902027
以一個(gè)簡(jiǎn)單的例子來(lái)引入C++中類(lèi)的靜態(tài)成員變量!
假入客戶(hù)給你提了一個(gè)需求:
- 統(tǒng)計(jì)在程序運(yùn)行期間某個(gè)類(lèi)的對(duì)象的數(shù)目
- 保證程序的安全性(不能使用全局變量)
- 隨時(shí)可以獲取當(dāng)前對(duì)象的數(shù)目
你或許會(huì)想到用類(lèi)的成員變量來(lái)做計(jì)數(shù)值。寫(xiě)出的代碼可能類(lèi)似下面的代碼:
#include <stdio.h>class Test { private:int mCount; public:Test() : mCount(0){mCount++;}~Test(){--mCount;}int getCount(){return mCount;} };Test gTest; //一個(gè)全局對(duì)象int main() {Test t1; //局部對(duì)象Test t2; //局部對(duì)象printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());return 0; }上面簡(jiǎn)單的代碼用成員變量mCount作為計(jì)數(shù)值,在拷貝構(gòu)造函數(shù)與析構(gòu)函數(shù)中分別作自加與自減運(yùn)算,看似當(dāng)生成一個(gè)對(duì)象時(shí),它的值就會(huì)加1,這樣通過(guò)獲取它的值就可以得知對(duì)象的數(shù)目。將代碼放到linux下運(yùn)行編譯輸出結(jié)果為:
count = 1 count = 1 count = 1為什么跟我們預(yù)想的不一樣呢?因?yàn)槊總€(gè)對(duì)象的成員變量都是每個(gè)對(duì)象專(zhuān)屬的,我定義了三個(gè)對(duì)象,那么我這三個(gè)對(duì)象的成員變量都是自己專(zhuān)屬的,其他對(duì)象的生成不會(huì)影響另一個(gè)對(duì)象的成員變量,而是調(diào)用該對(duì)象自己的成員變量,所以最終輸出結(jié)果為三個(gè)1.
下面我們把計(jì)數(shù)值改為一個(gè)全局變量,試試看會(huì)出現(xiàn)什么結(jié)果呢?
#include <stdio.h>int gCount; class Test { private:int mCount; public:Test() : mCount(0){gCount++;}~Test(){--gCount;}int getCount(){return gCount;} };Test gTest; //一個(gè)全局對(duì)象int main() {Test t1; //局部對(duì)象Test t2; //局部對(duì)象printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());return 0; }這個(gè)時(shí)候的輸出結(jié)果為:
count = 3 count = 3 count = 3好,至少我們達(dá)到了第一步,實(shí)現(xiàn)了這個(gè)功能!但是呢,用戶(hù)是有要求的,不能使用全局變量。因?yàn)槿肿兞吭诋?dāng)代軟件開(kāi)發(fā)過(guò)程中是不受歡迎的,它是不夠安全的!!!所以我們還是得想其他辦法:普通成員變量無(wú)法滿足,全局變量可以滿足,綜合他們兩,我們可以用靜態(tài)的成員變量!靜態(tài)成員變量在文件內(nèi)是全局屬性的。在C++中我們可以定義靜態(tài)成員變量:
- 靜態(tài)成員變量屬于整個(gè)類(lèi)所有
- 靜態(tài)成員的生命周期不依賴(lài)于任何對(duì)象(程序包運(yùn)行的整個(gè)周期)
- 可以通過(guò)類(lèi)名直接訪問(wèn)共有靜態(tài)成員變量
- 所有對(duì)象共享類(lèi)的靜態(tài)成員變量
- 可以通過(guò)對(duì)象名訪問(wèn)公有靜態(tài)成員變量
下面還是直接上代碼分析比較直接:
#include <stdio.h>class Test { private:static int cCount; public:Test(){cCount++;}~Test(){--cCount;}int getCount(){return cCount;} };int Test::cCount = 0; //這里是為什么?Test gTest;int main() {Test t1;Test t2;printf("count = %d\n", gTest.getCount());printf("count = %d\n", t1.getCount());printf("count = %d\n", t2.getCount());Test* pt = new Test(); //發(fā)生了什么?printf("count = %d\n", pt->getCount());delete pt; //發(fā)生了什么?printf("count = %d\n", gTest.getCount());return 0; }輸出結(jié)果為:
count = 3 count = 3 count = 3 count = 4 count = 3下面我們來(lái)分析代碼:這里static int cCount;定義的是一個(gè)靜態(tài)成員變量,因?yàn)殪o態(tài)全局變量隸屬于整個(gè)類(lèi)所有,不隸屬于某一個(gè)成對(duì)象,所以我們需要在類(lèi)外單獨(dú)給它分配空間,它位于全局?jǐn)?shù)據(jù)區(qū)!!!這樣在全局?jǐn)?shù)據(jù)區(qū)給靜態(tài)成員變量分配空間int Test::cCount = 0;
而這一段代碼: Test* pt = new Test(); Test* pt = new Test();這里我們定義一個(gè)指針對(duì)象指向一個(gè)堆空間,那么它就會(huì)調(diào)用拷貝 構(gòu)造函數(shù)使得cCount加1,delete pt;調(diào)用析構(gòu)函數(shù),使得cCount減1。
由以上分析得出靜態(tài)成員變量的幾條特性:
- 在定義時(shí)直接通過(guò)static關(guān)鍵字修飾
- 靜態(tài)成員變量需要在類(lèi)外單獨(dú)分配空間
- 靜態(tài)成員變量在程序內(nèi)部位于全局?jǐn)?shù)據(jù)區(qū)(但是文件間無(wú)法共享)
單獨(dú)分配空間的語(yǔ)法規(guī)則:
 Type ClassName::VarName = value;
總結(jié)
以上是生活随笔為你收集整理的【C++深度剖析教程3】C++中类的静态成员变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: linux安装思源字体下载,fedora
- 下一篇: 计算机软考论文分数,软考高级里哪个最好考
