C++分析講解類的靜態(tài)成員函數(shù)如何使用
一、未完成的需求
- 統(tǒng)計(jì)在程序運(yùn)行期間某個(gè)類的對(duì)象數(shù)目
- 保證程序的安全性(不能使用全局變量)
- 隨時(shí)可以獲取當(dāng)前對(duì)象的數(shù)目
在C++分析講解類的靜態(tài)成員變量是什么中每次打印對(duì)象的個(gè)數(shù)時(shí),都需要依賴于一個(gè)對(duì)象名,下面看一個(gè)代碼:
#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;
}按理說(shuō) count 應(yīng)該輸出為 0,但是 gTest 對(duì)象沒(méi)有定義,所以編譯就會(huì)報(bào)錯(cuò):

有沒(méi)有什么解決辦法呢?下面再看一段代碼:
#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)致這個(gè)賦值,這樣別人就會(huì)誤認(rèn)為這里面有 1000 個(gè)對(duì)象,這是不對(duì)的。

直接通過(guò)類名訪問(wèn)成員變量也是不可取的,安全性會(huì)打折扣。
那到底該怎么做呢?且看下面。
二、問(wèn)題分析
需要做的事情
- 不依賴對(duì)象就可以訪問(wèn)靜態(tài)成員變量
- 必須保證靜態(tài)成員變量的安全性
- 方便快捷的獲取靜態(tài)成員變量的值
三、靜態(tài)成員函數(shù)
在 C++ 中可以定義靜態(tài)成員函數(shù)
- 靜態(tài)成員函數(shù)是類中特殊的成員函數(shù)
- 靜態(tài)成員函數(shù)屬于整個(gè)類所有
- 可以通過(guò)類名直接訪問(wèn)公有靜態(tài)成員函數(shù)
- 可以通過(guò)對(duì)象名訪問(wèn)公有靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)的定義
直接通過(guò) static 關(guān)鍵字修飾成員函數(shù)

下面看一個(gè)靜態(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); 也是可以的哈,對(duì)應(yīng)于前面講的可以通過(guò)類名直接訪問(wèn)公有靜態(tài)成員函數(shù),也可以通過(guò)對(duì)象名訪問(wèn)公有靜態(tài)成員函數(shù)。
如果把void Demo::StaticSetI(Demo& d, int v) 這里變成:
void Demo::StaticSetI(int v)
{
i = v;
}編譯器就會(huì)報(bào)錯(cuò):

這是因?yàn)殪o態(tài)成員函數(shù)不能直接訪問(wèn)成員變量,可以通過(guò)對(duì)象名訪問(wèn)公有靜態(tài)成員函數(shù)。
靜態(tài)成員函數(shù) vs 普通成員函數(shù)
| 靜態(tài)成員函數(shù) | 普通成員函數(shù) | |
| 所有對(duì)象共享 | Yes | Yes |
| 隱含 this 指針 | No | Yes |
| 訪問(wèn)普通成員變量(函數(shù)) | No | Yes |
| 訪問(wèn)靜態(tài)成員變量(函數(shù)) | Yes | Yes |
| 通過(guò)類名直接調(diào)用 | Yes | No |
| 通過(guò)對(duì)象名直接調(diào)用 | Yes | Yes |
所以,滿足 1. 統(tǒng)計(jì)在程序運(yùn)行期間某個(gè)類的對(duì)象數(shù)目 2.保證程序的安全性(不能使用全局變量) 3.隨時(shí)可以獲取當(dāng)前對(duì)象的數(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ù)沒(méi)有隱藏的 this 參數(shù)
- 靜態(tài)成員函數(shù)可以通過(guò)類名直接訪問(wèn)
- 靜態(tài)成員函數(shù)只能直接訪問(wèn)靜態(tài)成員變量(函數(shù))
到此這篇關(guān)于C++分析講解類的靜態(tài)成員函數(shù)如何使用的文章就介紹到這了,更多相關(guān)C++靜態(tài)成員函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言模擬實(shí)現(xiàn)通訊錄程序過(guò)程
這篇文章主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)通訊錄程序過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
VS2019開發(fā)Linux C++程序的實(shí)現(xiàn)步驟
由于很多unix特有的函數(shù)無(wú)法在Windows上使用,而Vim又用的不太順手,突然想到最初用vs的時(shí)候有一個(gè)基于Linux的C++開發(fā)。本文就來(lái)介紹一下,感興趣的可以了解一下2021-07-07
用c語(yǔ)言實(shí)現(xiàn)一個(gè)電話薄(附完整代碼)
大家好,本篇文章主要講的是用c語(yǔ)言實(shí)現(xiàn)一個(gè)電話?。ǜ酵暾a),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法詳解
本篇文章是對(duì)利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法
這篇文章主要介紹了C++保存HBITMAP為位圖文件的實(shí)現(xiàn)方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下2021-01-01

