C C 中的關鍵字 static 和const

2021-07-15 16:44:32 字數 2591 閱讀 6515

靜態變數具有記憶功能,這次的值是上次修改的值,所以只能被初始化一次(儲存在靜態區的變數生命週期一般比較長,同               整個源程式共存亡,所以只需初始化一次);

分為靜態全域性變數和靜態區域性變數:靜態全域性變數只在定義它的原始檔內有效,其他原始檔無法訪問它;靜態區域性變數               儲存在全域性儲存區,雖然是區域性的(只能被作用域內的函式和變數訪問)但是存在於整個程式的生命週期,而普通局               部變數儲存在棧上,一旦呼叫結束立即被銷毀。

note:不能在標頭檔案中定義靜態變數,如果在標頭檔案中定義了靜態變數,包含這個標頭檔案的每個檔案都會單獨存在一              個靜態比那裡,造成空間浪費或者程式錯誤。不建議在標頭檔案中定義任何變數;

這個函式被限制在宣告它的模組範圍內使用,而不能被其他原始檔使用;static函式可以很好地解決不同原檔案中函式             同名的問題,因為乙個原始檔對於其他原始檔中的static函式是不可見的。

靜態資料成員被當做類的成員,供該類的所有物件共享訪問;區別於非靜態資料成員,每個物件都有自己          的複製品,屬於所在物件。

靜態資料成員儲存在全域性資料區,在定義時分配空間,在沒有產生類物件時作用域就是可見的,也就是說          在沒有類的例項時也可使用它。

靜態成員變數是在類內定義,類外初始化,且必須初始化。初始化時不用再加static關鍵字。

靜態成員變數同樣遵循public/protected/private訪問原則。

與全域性變數相比,靜態成員變數的優勢有:

靜態成員變數沒有進入程式的全域性名字空間,不會與程式中其他全域性變數產生命名衝突;

可以通過private實現資訊隱藏。

只能訪問類中的靜態成員變數,只能呼叫類中其他的靜態成員函式,不能訪問或者呼叫非靜態的成員變數或者成員函式;

同靜態成員變數一樣,只屬於類而不屬於類的特定物件;

非靜態成員函式一般隱藏乙個this指標指向類物件本身,由於靜態成員函式不與任何物件相聯絡,所以不具有this指標。

const在c語言中用於定義變數為常型別以及修飾函式引數和返回值;在c++中還可以修飾函式定義、修飾類物件。const修飾的變數或者物件的值是不能被改變的。

(1)const常量具有不可變性,除了初始化,不能對其進行賦值。

(2)可以進行型別檢查,當函式引數為const型別時,就是通知編譯器這個引數是乙個常量,不能再修改。

(3)可以很方便的進行引數調整,不變而已,一變都變。類似於巨集定義;

(4)防止被意外修改,增加程式的健壯性。

(5)c++中可以構成函式過載,在乙個類中,const函式與乙個非const的同名函式構成過載;

(6)對比與define節省空間,const只是給出了對應的記憶體位址,而define是每次訪問每次複製乙個。

(7)編譯器將普通的const變數放在符號表中,成為編譯期間的乙個常量,不分配儲存空間,避免了讀存操作,提高了效率。

(1)用於修飾一般常量(必須初始化)、常陣列、常物件、函式的常引數、函式的返回值;

(2)修飾常指標:

const int *a;修飾a指向的物件,a可變,a指向的內容不可變;

int const *a;修飾a指向的物件,a可變,a指向的內容不可變;

int *const a;修飾指標a,a不可變,a指向的內容可變;

const int * const a;a和a指向的物件都不可變;

(3)修飾常引用:表示該引用所引用的物件不可被改變;

const double &v;

(4)修飾類中的資料成員,初始化位置只能在引數列表裡,不能被修改,可被呼叫;

(5)修飾類的成員函式,宣告和定義處都要用const修飾;函式內部不會呼叫非const成員函式,不會修改類的資料成           員。可構成過載。

(6)修飾類物件:常物件只能呼叫const成員函式,可以訪問const或者非const資料成員,但是不能修改。

(7)在別的連線檔案中引用const變數形式:extern const int i;注意不能在對其賦值.

首先什麼是引用?

引用就是某個目標變數的「別名」(alias),對應用的操作與對變數直接操作效果完全相同。

申明乙個引用的時候,切記要對其進行初始化。引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變數名的別名。宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元。

如果是對乙個常量引用,編輯器首先建立乙個臨時變數,然後將變數的值置入臨時變數中,對該引用的操作就是對臨時變數的操作。

所以,既要利用引用提高效率,又要保護傳遞給函式的資料不在函式中被改變,就要使用常引用。

C C 中的static關鍵字

關鍵字extern和static用來說明具有靜態儲存期的變數和函式。用static宣告的區域性變數只能被定義該變數的函式所識別,但是不同於自動變數的是,static變數在其函式被呼叫退出後,仍保留其值。下次函式被呼叫時,可以訪問最近一次被修改後的值。static變數的宣告方法如下 static in...

C C 中的static關鍵字

static的用法主要分為兩大類,一種是在c語言中的用法,還有就是c 在類中的用法。2.在c 中 定義靜態全域性變數就是在全域性變數前加上 static 關鍵字 include static int a 10 這是靜態全域性變數 靜態全域性資料的特點 1 靜態全域性變數就在全域性資料段分配記憶體。2...

C C 中的static關鍵字

原理 預設的變數和函式名在編譯成彙編 s檔案後,會有.globl func name,globl指示告訴彙編器,func name這個符號要被鏈結器用到 彙編檔案在經過彙編器處理成二進位制的.o檔案時,符號會被變數或函式實際的位址值代替 所以要在目標檔案的符號表中標記它是乙個全域性符號。如果乙個變數...