深入解析 c 中定義同名的靜態變數

2021-10-06 14:37:27 字數 767 閱讀 7840

最近通過幫朋友解答c++的一道筆試題,學到了不少東西,在此記錄下。

題目如下:

看到這道題,大部分人都能意識到這道題考的是 static 關鍵字的相關知識,static 關鍵字定義的變數只會初始化一次,並且值會在作用域內共享。到此大部分分人直接選d選項就接啥這道題了。

但是細心的人可能會問,呼叫三次fun()函式,a被定義了三次,為什麼不會報編譯錯誤呢?這就要從static變數初始化的階段談起了,首先我們先了解一下c++中關於靜態變數的三條規則:

在c++中,全域性static變數和class的static成員變數在main函式之前初始化,main函式之後銷毀

函式內部的區域性static變數在該函式第一次被呼叫時初始化,在main函式之後銷毀

對於static資料即使是函式內部的物件則存放在全域性資料區,全域性資料區的資料並不會因為函式的退出就將空間釋放。

根據上邊三條規則可知,函式內部static變數的初始化發生在函式第一次被呼叫之前,換句話說函式內部定義靜態變數的**會被單獨拿出來,並在函式第一次呼叫之前被統一執行,這解釋了為什麼無法用變數對靜態變數賦值。因此,多次執行fun()函式並不會重複定義類內的靜態變數。

此外,在不同作用域內,可以定義多個同名的靜態變數,例如函式內和函式外可以定義兩個同名的靜態變數。這些不同作用域內的同名靜態變數有著不同的記憶體位址,在引用時也會遵循就近原則,不會彼此影響。

C 中關於靜態變數

參考上述部落格 1 該部落格中說道 靜態全域性變數不能被其他檔案所用.因而其他檔案可以定義相同名字的變數,而不會發生衝突.時舉的例子說把static int n 改為 int n 這裡extern int n 的意思是使用在第乙個檔案中已經定義的變數n,但因為第乙個檔案裡定義的是static的,所以...

C 類中的靜態變數

c 類中的靜態變數 靜態資料成員 下面看乙個例子 include class point static void init void main void 這樣編譯是不會有任何錯誤的。下面這樣看 include class point static void init void main void 這...

java中靜態變數和非靜態變數的區別

靜態變數前有static關鍵字修飾。1.記憶體分配 靜態變數在應用程式初始化時,就存在於記憶體當中,直到它所在的類的程式執行結束時才消亡 非靜態變數需要被例項化後才會分配記憶體。2.生存週期 靜態變數生存週期為應用程式的存在週期 非靜態變數的存在週期取決於例項化的類的存在週期。3.呼叫方式 靜態變數...