staic 靜態 變數的作用

2021-06-08 16:37:51 字數 1584 閱讀 6339

在c語言中,關鍵字static的意思是靜態,它有三個明顯的作用:首先,在函式體內,靜態變數具有「記憶」功能,即乙個被宣告為靜態的變數在這一函式被呼叫過程中其值維持不變。其次,在模組內(但在函式體外),它的作用域範圍是有限制的,即如果乙個變數被宣告為靜態的,那麼該變數可以被模組內所有函式訪問,但不能被模組外其它函式訪問,它是乙個本地的全域性變數,而如果乙個函式被宣告為靜態的,那麼該函式與普通函式作用域不同,其作用域僅在本檔案中,它只可被這一模組內的其它函式呼叫,不能被模組外的其它函式呼叫,也就是說這個函式被限制在宣告它的模組的本地範圍內使用。所以,內部函式應該在當前原始檔中說明和定義,對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案。

具體而言,static全域性變數和普通的全域性變數的區別在於static全域性變數只初始化一次,這樣做的目的是為了防止在其它檔案單元中被引用。static區域性變數和普通區域性變數的區別在於static區域性變數只被初始化一次,下一次的運算依據是上一次的結果值。static函式與普通函式的區別在於作用域不一樣,static函式只在乙個原始檔中有效,不能被其它原始檔使用。

在c++中,在類內資料成員的宣告前加上關鍵字static,該資料成員就是類內的靜態資料成員。靜態資料成員有以下特點:

(1)       對於非靜態資料成員,每個類物件都有自己的拷貝。而靜態資料成員被當作是類的成員。無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷貝,由該型別的所有物件共享訪問。

(2)       靜態資料成員儲存在全域性資料區。定義時要分配空間,所以不能在類宣告中定義。由於靜態資料成員屬於本類的所有物件共享,所以,它不屬於特定的類物件,在沒有產生類物件時其作用域就可見,即在沒有產生類的例項時,程式設計師也可以使用它。

(3)       靜態資料成員和普通資料成員一樣遵從public,protected,private訪問規則;

(4)       static成員變數的初始化是在類外,此時不能再帶上static的關鍵字private,protected 的static成員雖然可以在類外初始化,但是不能在類外被訪問。

與全域性變數相比,使用靜態資料成員有兩個優勢:

(1)       靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性。

(2)       可以實現資訊隱藏。靜態資料成員可以是private成員,而全域性變數不能。

需要注意的是,類的靜態成員必須初始化,因為它是在程式初始化的時候分配的,所以必須有初始化,類中只是宣告,在cpp中才是初始化,可以在初始化的**上放個斷點,在程式執行main的第一條語句之前就會先走到那,如果靜態成員是個類,那麼就會呼叫到它的建構函式。

與靜態資料成員一樣,當類的成員函式前面新增了static關鍵字後就變為了類的靜態成員函式,靜態成員函式為類的全部服務而不是為某乙個類的具體物件服務。靜態成員函式是類的內部實現,屬於類定義的一部分。普通的成員函式一般都隱含了乙個this指標,this指標指向類的物件本身,因為普通成員函式總是具體的屬於某個類的具體物件的。通常情況下,this是預設的。如函式fn()實際上是this->fn()。但是與普通函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式。

區域性變數 靜態變數staic 全域性變數

基礎概念就不用多講,相信大家都知道,不知道很用以查到對應的資料,現在就把比較明顯的差別根據本人所掌握的介紹一下 區域性變數 函式中定義的變數稱為區域性變數。1 乙個函式中定義的變數不能被另乙個函式使用。2 每次呼叫函式時區域性變數都表示不同的儲存空間。方法內部定義的變數,在程式執行到它的時候,系統為...

靜態變數 非靜態變數的區別

c 變數根據定義位置的不同,具有不同的作用域,作用域可分為6種 全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。從作用域看 全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字...

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...