網(wǎng)站首頁 編程語言 正文
一、未完成的需求
- 統(tǒng)計在程序運行期間某個類的對象數(shù)目
- 保證程序的安全性(不能使用全局變量)
- 隨時可以獲取當前對象的數(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; 可以認為是意外導(dǎo)致這個賦值,這樣別人就會誤認為這里面有 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é)果如下:
當然,把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;
}
編譯器就會報錯:
這是因為靜態(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)計在程序運行期間某個類的對象數(shù)目 2.保證程序的安全性(不能使用全局變量) 3.隨時可以獲取當前對象的數(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ù))
原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/124260491
相關(guān)推薦
- 2022-09-23 python?pandas創(chuàng)建多層索引MultiIndex的6種方式_python
- 2023-01-29 python缺失值填充方法示例代碼_python
- 2022-02-13 使用paddlepaddle進行手寫數(shù)字識別
- 2022-09-03 python中*args與**kwarsg及閉包和裝飾器的用法_python
- 2022-01-19 webpack5 配置熱更新失效問題
- 2022-11-04 React組件化學(xué)習(xí)入門教程講解_React
- 2022-12-26 python如何修改圖像的分辨率_python
- 2022-03-17 詳解Golang函數(shù)式選項(Functional?Options)模式_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支