C++深入理解(5)------靜態持續變量(讀書筆記)

    C++爲靜態持續變量提供了三種連接性:外部鏈接性(可在不同文件中訪問)、內部連接性(只能在當前文檔中使用)、無連接性。下面介紹什麼是靜態變量:靜態變量就是在整個程序持續中都是存在的,在整個過程中靜態變量的數量都是不變的,程序並不需要特殊的裝置(棧)來管理他,而是在程序的一開始就申請內存。所以也可以叫做靜態持續變量。

    簡單說下怎麼創建三種不同鏈接性的變量:1、外部鏈接性:需要在代碼塊的外部定義;2、內部鏈接性:需要在代碼塊的外部定義,但是要使用static聲明,表名是內部可以訪問的;3、無連接性:在代碼塊內部定義,並使用static聲明,這樣的變量在整個代碼執行週期內都是存在的,但是只能在代碼塊的內部訪問他。

int a;            //外部鏈接性
static int b;     //內部鏈接性

int func(int a,int b)
{
    static int c; //無鏈接性
}    

    這裏需要格外注意的一點就是隻能被初始化1次;注意初始化一次和賦值一次的區別,初始化一次指只能被賦一次初值,如執行函數func()中static int c=10,那麼再次執行該函數的時候,這行代碼就會被忽略,因爲已經賦了一次值了。靜態持續變量如果不給其初始化的話,會默認初始化爲0;例如上面代碼並沒有賦值,那麼c就是0了,即使在下面執行c=10;也是再執行c的賦值操作,而並非初始化;

1.具有外部鏈接性的變量:
    具有外部鏈接性的靜態變量又叫做外部變量或者全局變量。C++有單定義規則,即變量只能被定義一次,所以在C++中有兩種聲明方式:定義聲明和引用聲明,定義聲明給變量分配存儲空間,引用聲明則是不分配空間,表明之前有定義過此變量。只有使用extern聲明,且不能被初始化的變量才能是引用變量,否則就是定義變量,如下面代碼:

double  a;         //定義變量
extern double a;   //聲明變量
extern double a=10 //定義變量

    外部變量有一點需要注意的是:如果在函數中定義了與全局變量同名的變量,那麼是使用局部變量還是全局變量那?答案是使用局部變量,暫時覆蓋了全局變量。那麼在有同名局部變量的情況下,我們該如何使用同名的全局變量那?答案是使用::符號,如::a;

2.具有內部鏈接性的變量

    就是用static在代碼塊的外部定義的內部變量,只能在本文件中訪問,而不能在其他文件中訪問。

    一般會遇到這樣的問題,在外部有一個外部變量,但是本文件中不打算使用該外部變量,於是用static定義了一個同名的內部變量,這樣就會覆蓋該外部變量,從而達到隔離變量的效果。

3.無連接性的變量

    也就是在函數的內部定義的變量,該變量存在於整個執行過程,擁有特定的內存,當再次執行該函數時,此變量還是上次執行函數操作後變量的值,並不會在此被初始化。


在這裏插一條容易被忽略的知識點,使用const int a = 10這樣定義的變量實際上是隻具有內部鏈接性的,也就是說在外部是無法訪問a的值的,因此可以放心的將此句賦值定義放在頭文件中,沒一個包含此頭文件的源文件都會定義一個具有內部連接性的變量,即只能在本文件中使用,但是如果想設計成外部的const int a應該怎麼辦呢,答案是使用extern const int a = 10;這句話以爲着定義一個外部變臉,因此在其他文件中如果想使用的話只能使用extern int a這樣的聲明,不能再次做定義。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章