C++深度解析 類的靜态成員變量 --- static(24)
成員變量的回顧
通過對象名能夠通路public成員變量。
每個對象的成員變量都是專屬的。
成員變量不能在對象之間共享。
PS:成員變量是對象自己的,是以成員變量一般都設定為私有的。
新的需求:
- 統計在程式運作期間某個類的對象數目。
- 保證程式的安全性(不能使用全局變量)。
- 随時可以擷取目前對象的數目。
示例程式:
#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;
}
結果如下:
分析:我們期望的是列印3,但是結果為1。因為mCount是成員變量,成員變量是每個對象都有一套的,三個對象gTest,t1,t2都有一個mcount,并且在構造函數裡mcount初始化為0。
靜态成員變量
在C++中可以定義靜态成員變量
- 靜态成員變量屬于整個類所有
- 靜态成員變量的生命期不依賴于任何對象
- 可以通過類名直接通路公有靜态成員變量
- 所有對象共享類的靜态成員變量
- 可以通過對象名通路公有靜态成員變量
靜态成員變量的特性
- 在定義時直接通過static關鍵字修飾
- 靜态成員變量需要在類外單獨配置設定空間
- 靜态成員變量在程式内部位于全局資料區
文法規則:(在類的外部,單獨定義,以便為它配置設定空間)
Type ClassName::VarName = value;
示例程式:
#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()); //3
printf("count = %d\n", t1.getCount()); //3
printf("count = %d\n", t2.getCount()); //3
//指針pt指向堆空間的一個對象
Test* pt = new Test();
printf("count = %d\n", pt->getCount()); //4
delete pt;
printf("count = %d\n", gTest.getCount()); //3
return 0;
}
結果如下:
小結
類中可以通過static關鍵字定義靜态成員變量
靜态成員變量隸屬于類所有
每一個對象都可以通路靜态成員變量
靜态成員變量在全局資料區配置設定空間
靜态成員變量的生命期為程式運作期