網站首頁 編程語言 正文
1. 隱藏
當同時編譯多個文件時,所有未加 static 前綴的全局變量和函數都具有全局可見性。
下面是一個簡單的例子:
假設我們要編譯兩個文件 a.c 和 main.c
// a.c
char a = 'A';
void msg()
{
? ? printf("Hello\n");
}
//main.c
int main(void)
{
?? ?extern char a;
?? ?print(“%c ”, a);
?? ?(void)msg();
?? ?return 0;
}
此時程序運行的結果是:
A Hello
而如果在 a 和 msg 定義前加了 static,那么 main.c 就無法使用它們了。利用這一特性可以避免命名沖突。
對于函數來說,static 的作用僅限于隱藏。而對于變量來說,它還有其他作用。
2. 保持變量內容的持久
儲存在靜態數據區的變量會在程序剛開始運行時完成它唯一的一次初始化,它與全局變量一起儲存在靜態存儲區,只不過 static 的作用域不一定是全局的。
說到底,這其實也可以理解為一種隱藏。
int func(void)
{
?? ?static int count = 10; //僅在初始化時被執行了一次,靜態變量只會進行一次初始化
?? ?return count—-;
}
int count = 1;
int main(void)
{
?? ?printf(“global\t\tlocal static\n”);
?? ?for (; count<=10; count++)
?? ?{
?? ??? ?printf(“%d\t\t%d\n”, count, func());
?? ?}
?? ?return 0;
}
3. 默認初始化為 0
全局變量也有這一特點,因為它也存儲在靜態數據區。
在靜態數據區中,所有的字節默認值都是 0x00,利用這一特點可以減少工作量。
如初始化一個稀疏矩陣,就能省去把所有位置置 0 的操作。
4. 多個對象之間數據共享
在類中,靜態成員可實現多個對象的數據共享,而且由于隱藏的特點,它也同時保證了安全性。
靜態成員的初始化格式:<數據類型><類名>:: <靜態成員名>=<值>
- 初始化在類體外進行,而且前面不加 static,以免與靜態變量或對象混淆。
- 初始化時不加訪問權限控制符 private public 等
- 初始化時用作用域運算符標明它所屬的類。由此也可以看出靜態數據成員是類的成員,而不是對象的成員。
引用靜態數據成員的格式:<類名>:: <靜態成員名>
下面是幾個例子:
class Point
{
public:
?? ?void output() {}
?? ?static void init()
?? ?{
?? ??? ?x = 0;
?? ??? ?y = 0;
?? ?}
private:
?? ?int x;
?? ?int y;
}
int main(void)
{
?? ?Point:: init();
?? ?return 0;
}
報錯,因為非靜態數據成員此時還沒有分配內存。
class Point
{
public:
?? ?void output() {}
?? ?static void init()
?? ?{
?? ??? ?x = 0;
?? ??? ?y = 0;
?? ?}
private:
?? ?static int x;
?? ?static int y;
}
int main(void)
{
?? ?Point:: init();
?? ?return 0;
}
報錯,因為靜態成員變量需要進行初始化。
5. 注意
類的靜態成員函數屬于整個類,因此沒有 this 指針,這就導致了它僅能訪問靜態數據和靜態成員函數。
不能將靜態成員函數定義為虛函數。
對靜態成員進行取地址操作會有些特殊,變量地址是指向其數據類型的指針,函數地址類型是一個 “nonmember 函數指針”。
由于沒有 this 指針,所以相當于 nonmember 函數,這就有一個好處:成為一個 callback 函數,使得我們將 C++ 和 C-based X Window 系統結合,也成功應用于線程函數身上。
父類和子類共享靜態成員。為了防止父類的影響,可以在子類中定義一個與父類相同的靜態變量,以屏蔽父類的影響。這不會引起錯誤,因為編譯器采用了 name-mangling 方法以生成唯一的標志。
總結
原文鏈接:https://blog.csdn.net/SP_FA/article/details/124633750
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-03-26 C++中靜態數據成員使用示例_C 語言
- 2023-05-17 一文速學Python+Pyecharts繪制樹形圖_python
- 2022-10-17 Kotlin編程基礎語法編碼規范_Golang
- 2023-04-29 C/C++并查集的查詢與合并實現原理_C 語言
- 2022-01-22 oracle之連接查詢和子查詢
- 2022-10-15 詳解C語言中雙指針算法的使用_C 語言
- 2023-09-18 子組件向父組件傳值的4種方法
- 2022-09-23 WPF仿微信實現截圖功能的方法詳解_C#教程
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支