1.static關鍵字
static無論是修飾全域性變數還是區域性變數都是限制此變數的使用範圍。
1.1 static修飾全域性變數
static 修飾全域性變數時表示此變數只能在宣告他的檔案使用,所以在其他檔案中可以宣告同樣的名字,他們是兩個不同的變數,所以這種顯示的static是不能被extern的。而全域性變數是陰式的static,作用範圍是整個工 程,預設是外部鏈結,所以其他檔案可以使用此變數(使用時先宣告extern int a類似的變數).
總結下就是static和全域性變數的區別意在static修飾過的變數不可被外部的檔案使用,但是可以通過呼叫static所在檔案中的函式來使用。
1.2 static修飾區域性變數
static在函式體內使用時,只在首次定義時初始化一次,也就是說記錄了上一次的變數值,此時區域性變數在堆上分配記憶體。
靜態區域性變數正好可以解決這個問題。靜態區域性變數儲存在全域性資料區,而不是儲存在棧中,每次的值保持到下一次呼叫,直到下次賦新值。
靜態區域性變數有以下特點:
該變數在全域性資料區分配記憶體;
靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;
它始終駐留在全域性資料區,直到程式執行結束。但其
作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束;
1.3 static 修飾函式
static修飾函式就是放在函式體的前面,列如,static int pp(int a);此函式只能被定義其的原始檔使用,不可被外部的檔案使用。 定義
靜態函式的好處:
靜態函式不能被其它檔案所用;
其它檔案中可以定義相同名字的函式,不會發生衝突;
1.4 static 與類
static類成員變數
static的類成員變數只能被宣告他的類使用,作用域就是如同類中的private的作用域,但是static變數在此類的所有物件中只有乙份拷貝,即所有的類物件共用乙份,static類成員變數在全域性資料中分配記憶體,所有在定義時就要分配記憶體,所有其定義與在類中的宣告應該分開,類似 int class::a=0;此種初始化。
同 全域性變數相比,使用靜態資料成員有兩個優勢:
靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性;
可以實現
資訊隱藏。靜態資料成員可以是private成員,而全域性變數不能;
static類成員函式
static類成員函式與普通的類成員函式的區別在於隱含this導致的,static函式不具備物件的this指標,他是某類所有例項物件 共享的部分,所以static類成員函式不能通過this訪問非static成員變數和成員函式,只能訪問static 變數。
關於靜態成員函式,可以總結為以下幾點:
出現在類體外的函式定義不能指定
關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;
非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;
靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;
由於沒有this
指標的額外開銷,因此靜態成員函式與類的
全域性函式相比速度上會有少許的增長;
注意:
不能將靜態成員函式定義為
虛函式 。(非成員函式不能被虛擬化)
為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。這裡有一點需要注意:我們說
靜態成員為父類和子類共享,但我們有重複定義了靜態成員,這會不會引起錯誤呢?不會,我們的
編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌。在各通訊公司的筆試面試中經常出現的考題就是static的作用及功能。
C語言筆錄 2 C 語言中 static
c 語言中 static 的作用 1.先來介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加 static 字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是 a.c,另乙個是 main.c。下面是 main.c 的內容 下面...
2 C 程式設計學習 Windows Forms
2.c 程式設計學習 windows forms windows form 是 microsoft windows 應用程式開發的新平台,以 net framework 為基礎。這種架構提供清晰 物件導向且可延伸的類別集,讓您能夠開發各種 windows 應用程式。乙個單獨的應用程式可以同時包括這兩...
C 學習筆記2 C 變數
1 當乙個精度高的資料型別與乙個精度低的資料型別進行運算時,定義運算結果的變數型別必須與精度最高的變數型別相同。這是為了防止在運算過程中造成資料丟失。如下 double a 42.29 int b 4229 int c a b console.writeline c c console.readke...