變數與函式深入研究

2021-10-09 11:56:05 字數 2260 閱讀 4421

2.區域性變數

2.3.1. static區域性變數的好處

3.函式

在函式外定義的變數稱為全域性變數,也稱外部變數,全域性變數的作用域較廣,全域性變數不屬於任何乙個函式,理論上可被其作用域中的所有函式訪問,因此,提供了乙個不同函式間聯絡的途徑,使函式間的資料聯絡不只侷限於引數傳遞和return語句。**全域性變數的作用域就是從其定義處到原始檔結束,呼叫全域性變數不能超出其作用域。全域性變數一經定義,編譯器會為其分配固定的記憶體單元,在程式執行期間,這塊記憶體單元始終有效,**一直到程式執行完畢才由作業系統收回該塊記憶體。所謂全域性,是說該變數可以在程式的任意位置使用,其作用域是整個程式**範圍內,可以被程式其他函式所引用,不僅僅侷限在本檔案。

最重要的是:如果想引用源程式中其他檔案中的全域性變數(陣列),要先宣告,在宣告的時候,一定要加上extern 關鍵字。如果不加關鍵字,那麼就會造成重複定義的錯誤!!!

在全域性變數之前加上關鍵字static,全域性變數就被定義成為乙個全域性靜態變數。

1)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)

2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0。

3)作用域:全域性靜態變數在宣告他的檔案之外是不可見的。準確地講從定義之處開始到檔案結尾。

好處:定義全域性靜態變數的好處:

<1>不會被其他檔案所訪問,修改

<2>其他檔案中可以使用相同名字的變數,不會發生衝突。

定義與宣告的區別:把建立儲存空間的變數宣告稱定義,而把不需要建立儲存空間的宣告稱為宣告

僅僅在定義它的函式的內才能有效使用,其作用域僅限在函式體內,即從變數定義的位置開始,到函式體結束。

通常,編譯器不為區域性變數分配記憶體單元,而是在程式執行中,當區域性變數所在的函式被呼叫時,系統根據需要臨時為其分配記憶體。當函式執行結束時,區域性變數被撤銷,占用記憶體被收回。

注意:

區域性變數在函式被呼叫時由系統分配儲存區,在不同的宣告週期的函式中同名的變數實際上在記憶體中佔不同的單元,因此在不同的函式中可以定義相同名字的區域性變數。生命週期相同的函式的同名區域性變數,占用不同的記憶體單元。

所以區域性變數的記憶體的分配方式是:自動分配,自動釋放。

區域性變數之前加上關鍵字static,區域性變數就被定義成為乙個區域性靜態變數。

靜態區域性變數,只有定義,沒有宣告。如果定義時沒有賦值,預設其值為0

1)記憶體中的位置:靜態儲存區

2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0

3)作用域:作用域仍為區域性作用域,當定義它的函式或者語句塊結束的時候,作用域隨之結束

注:當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。

當static用來修飾全域性變數的時候,它就改變了全域性變數的作用域(在宣告他的檔案之外是不可見的),但是沒有改變它的存放位置,還是在靜態儲存區中。

統計次數功能

宣告函式的乙個區域性變數,並設為static型別,作為乙個計數器,這樣函式每次被呼叫的時候就可以進行計數。這是統計函式被呼叫次數的最好的辦法,因為這個變數是和函式息息相關的,而函式可能在多個不同的地方被呼叫,所以從呼叫者的角度來統計比較困難。

定義乙個函式我們已經不陌生了,函式本就有全域性屬性,如果想在原始檔中的其他檔案中呼叫本檔案的函式,只需要在那個檔案中宣告一下即可,宣告的方式一般都是包含相應的標頭檔案。

在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。

函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。

定義靜態函式的好處:

<1> 其他檔案中可以定義相同名字的函式,不會發生衝突

<2> 靜態函式不能被其他檔案所用。

靜態函式會被自動分配在乙個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。

關鍵字「static」,譯成中文就是「靜態的」,所以內部函式又稱靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。 使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。

深入研究析構函式

析構函式是c 中乙個神奇的部分,在呼叫析構函式時,並不需要像普通函式一樣寫出函式呼叫的 而是由編譯器將析構函式插入到程式中合適的呼叫地方。如果你不清楚這些插入析構函式的地方,就會出現一些很難解決的錯誤。在分析析構函式的執行時,乙個經典的示例是全域性變數的析構過程。我們來考慮下面的 當執行這個程式時,...

函式模板深入研究

1.編譯器並不是把函式模板處理成能夠處理任意類的函式 2.編譯器從函式模板通過具體型別產生不同的函式 3.編譯器會對函式模板進行兩次編譯 4.在宣告的地方對模板 本身進行編譯 在呼叫的地方對引數替換後的 進行編譯。include using namespace std templatet max t...

flex Bindable深入研究

bindable 元資料標籤,它在 中的作用就是向編譯器提供如何編譯程式的資訊。它的最大作用是使程式元件間的資料同步變得容易。在開發中通常用上bindable作用在檢視控制項上,如給它繫結乙個物件,則以後只需要在邏輯層更改這個物件的值,則檢視層的控制項資料會自動更新 同步 而不再需要手動去更新檢視。...