class test
;
成員變數的初始化有且僅有兩種:1、「=」賦值。2、
成員初始化列表
。其中只能用方法2的有常量成員(不包括靜態的)、引用型別成員。
靜態成員和靜態常量成員由於是類共有的,不是屬於某乙個物件,因此不能在建構函式中初始化。
靜態成員(這裡不包括靜態常量成員)必須在類外初始化。
成員變數的初始化順序只與宣告的順序一致,與成員初始化列表順序無關。
class test
};
int test::c=1;
const int test::d=1;//也可以這樣初始化
restrict只用於限定指標。用於告知編譯器,所有修改該指標所指向內容的操作全部都是基於該指標的,即不存在其它進行修改操作的途徑。這樣可以幫助編譯器進行更好的**優化,生成更有效率的彙編**。
對於內建算術型別變數,宣告為const之後是不允許改變變數的值的。也因為這樣,const變數在宣告的時候必須進行初始化。
const int i=0;
i=2;//非法!不允許改變
const int a;//錯誤,要進行初始化
引用初始化繫結給乙個變數之後繫結是無法改變的,所以對引用的const主要在於能否用引用來改變繫結變數的值。
1、用const引用繫結乙個const變數值的時候,原值無法改變,也不能通過引用改變變數的值
const int i=3;
const int &r=i;
i=2;//錯誤
r=2;//錯誤
2、用const引用繫結乙個非const變數值的時候,原值可以改變,但是不能通過引用改變。
int i=3;
const int &r=i;
i=2;//正確
r=2;//錯誤
3、不能用非const引用繫結乙個const變數。
const int i=3;
int &r=i;//錯誤
4、當引用為const時,可以把「它能夠轉換成自己型別的值」給引用
double pi=3.14;
const int &r=p;//正確,並且r=3
const int &r2=3;//正確,r2=3
這裡需要說明的是r並沒有引用pi,相反在進行這個操作的時候,分配了專門的記憶體來存放r所引用的位置,並且值為3,型別為整形。r值到達這塊記憶體的唯一介面。
int i=3;
const int *p1=&i;//不可以通過指標改變i
int *const p2=&i;//不可以改變指標的指向
const int *const p3=&i;//既不可以改變i,也不可以改變指向
c++中把直接對變數記憶體單元中的const限制稱為top-level const,即無法改變記憶體中的值。把對間接指向和引用的值的const限制稱為low-level const,即無法改變所指向和所引用的值。在兩個變數進行賦值操作時,必須要有同樣的level才可以。
1、top-level可以忽略掉
int i=0;//non-level
int *const p=&i;//top-level
2、low-level不可以忽略
const int *p1=&i;
int *p2=p1;//錯誤 因為p1是low-level而p2不是,所以不能進行p2=p1的操作。
3、在右邊的non-leve可以轉換為左邊的low-level。 而反過來不可以
int i =0;
int *p1=&i;
const int *p2=p1;//ok
p1=p2;//wrong因為p2具有low-level而p1沒有,所以可以p2=p1而不能p1=p2。
1、靜態全域性變數
在全域性變數前,加上關鍵字static。
該變數在全域性資料區分配記憶體(詳情參考)。
未經初始化的靜態全域性變數會被程式自動初始化為0。
靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的(其它檔案中可以定義相同名字靜態變數,不會發生衝突)。
2、靜態區域性變數
每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。
靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;
它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束;
3、靜態函式
宣告函式的檔案當中可見,不能被其它檔案使用。 1
、靜態資料成員
該資料成員就是類內的靜態資料成員。無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷貝,由該型別的所有物件共享訪問。
靜態資料成員儲存在全域性資料區。靜態資料成員定義時要分配空間,所以不能在類宣告中定義。
遵從public,protected,private訪問規則。
靜態資料成員沒有進入程式的全域性名字空間,因此不存在與程式中其它全域性名字衝突的可能性。
可以實現資訊隱藏。靜態資料成員可以是private成員,而全域性變數不能。
2、靜態成員函式
靜態成員函式與靜態資料成員一樣,都是類的內部實現,屬於類定義的一部分,而不是物件。
普通的成員函式一般都隱含了乙個this指標,this指標指向類的物件本身,因為普通成員函式總是具體的屬於某個類的具體物件的。通常情況下,this是預設的。如函式fn()實際上是this->fn()。但是與普通函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式。由於沒有this指標的額外開銷,因此靜態成員函式與類的全域性函式相比速度上會有少許的增長。
出現在類體外的函式定義不能指定關鍵字static;
1、用在模板定義裡,標明其後的模板引數是型別引數
template
2、模板中標明「內嵌依賴型別名」
typenameiterator_traits<_inputiter>::difference_type __n = 0; //變數定義,說明difference_type是型別而不是乙個類靜態變數。
c c 變數儲存
1 靜態儲存區,是在程式編譯時就已經分配好的,在整個執行期間都存在,如全域性變數 常量。2 棧上分配,函式內的區域性變數就是從這分配的,但分配的記憶體容易有限。3 堆上分配,也稱動態分配,如我們用new,malloc分配記憶體,用delete,free來釋放的記憶體。static全域性變數與普通的全...
C C 編譯詳解
電子計算機所使用的是由 0 和 1 組成的二進位制數,二進位制是計算機的語言的基礎。計算機發明之初,人們只能降貴紆尊,用計算機的語言去命令計算機幹這幹那,一句話,就是寫出一串串由 0 和 1 組成的指令序列交由計算機執行,這種語言,就是機器語言。想象一下老前輩們在打孔機面前數著乙個乙個孔的情景,噓,...
C C 堆疊詳解
在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...