日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++深度剖析教程3】C++中类的静态成员变量

發布時間:2023/12/10 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++深度剖析教程3】C++中类的静态成员变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 學習交流加(可免費幫忙下載CSDN資源):
  • 個人微信: liu1126137994
  • 學習交流資源分享qq群1(已滿): 962535112
  • 學習交流資源分享qq群2: 780902027

以一個簡單的例子來引入C++中類的靜態成員變量!

假入客戶給你提了一個需求:

  • 統計在程序運行期間某個類的對象的數目
  • 保證程序的安全性(不能使用全局變量)
  • 隨時可以獲取當前對象的數目

你或許會想到用類的成員變量來做計數值。寫出的代碼可能類似下面的代碼:

#include <stdio.h>class Test { private:int mCount; public:Test() : mCount(0){mCount++;}~Test(){--mCount;}int getCount(){return mCount;} };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());return 0; }

上面簡單的代碼用成員變量mCount作為計數值,在拷貝構造函數與析構函數中分別作自加與自減運算,看似當生成一個對象時,它的值就會加1,這樣通過獲取它的值就可以得知對象的數目。將代碼放到linux下運行編譯輸出結果為:

count = 1 count = 1 count = 1

為什么跟我們預想的不一樣呢?因為每個對象的成員變量都是每個對象專屬的,我定義了三個對象,那么我這三個對象的成員變量都是自己專屬的,其他對象的生成不會影響另一個對象的成員變量,而是調用該對象自己的成員變量,所以最終輸出結果為三個1.

下面我們把計數值改為一個全局變量,試試看會出現什么結果呢?

#include <stdio.h>int gCount; class Test { private:int mCount; public:Test() : mCount(0){gCount++;}~Test(){--gCount;}int getCount(){return gCount;} };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());return 0; }

這個時候的輸出結果為:

count = 3 count = 3 count = 3

好,至少我們達到了第一步,實現了這個功能!但是呢,用戶是有要求的,不能使用全局變量。因為全局變量在當代軟件開發過程中是不受歡迎的,它是不夠安全的!!!所以我們還是得想其他辦法:普通成員變量無法滿足,全局變量可以滿足,綜合他們兩,我們可以用靜態的成員變量!靜態成員變量在文件內是全局屬性的。在C++中我們可以定義靜態成員變量:

  • 靜態成員變量屬于整個類所有
  • 靜態成員的生命周期不依賴于任何對象(程序包運行的整個周期)
  • 可以通過類名直接訪問共有靜態成員變量
  • 所有對象共享類的靜態成員變量
  • 可以通過對象名訪問公有靜態成員變量

下面還是直接上代碼分析比較直接:

#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(); //發生了什么?printf("count = %d\n", pt->getCount());delete pt; //發生了什么?printf("count = %d\n", gTest.getCount());return 0; }

輸出結果為:

count = 3 count = 3 count = 3 count = 4 count = 3

下面我們來分析代碼:這里static int cCount;定義的是一個靜態成員變量,因為靜態全局變量隸屬于整個類所有,不隸屬于某一個成對象,所以我們需要在類外單獨給它分配空間,它位于全局數據區!!!這樣在全局數據區給靜態成員變量分配空間int Test::cCount = 0;

而這一段代碼: Test* pt = new Test(); Test* pt = new Test();這里我們定義一個指針對象指向一個堆空間,那么它就會調用拷貝 構造函數使得cCount加1,delete pt;調用析構函數,使得cCount減1。

由以上分析得出靜態成員變量的幾條特性:

  • 在定義時直接通過static關鍵字修飾
  • 靜態成員變量需要在類外單獨分配空間
  • 靜態成員變量在程序內部位于全局數據區(但是文件間無法共享)

單獨分配空間的語法規則:
Type ClassName::VarName = value;

總結

以上是生活随笔為你收集整理的【C++深度剖析教程3】C++中类的静态成员变量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。