C C 變數詳解

2021-08-09 23:20:21 字數 3943 閱讀 7843

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語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...