c const關鍵字 總結

2021-06-20 03:28:44 字數 3339 閱讀 8450

在全域性作用於里定義非const變數時,在整個程式中都可以訪問.除非特別說明,在全域性作用於的宣告的const變數時定義該物件的檔案的區域性變數.死變數只存在與那個檔案中,不能被其他檔案訪問.

非const變數預設為extern.要使const變數能夠在其他地方的檔案中訪問,必須顯示指定為extern.

//非const變數

int counter;

extern int counter;

++counter;

//const變數

extern const int bufsize=fcn();//宣告與定義

extern const int bufsize;//宣告

const引用是指向const物件的引用.

const引用可以初始化為不同型別的物件或者初始化為右值.

int i=42;

const int &r=42;

const int &r2=r+i;

但同樣的初始化對於非const引用確實不合法的,導致編譯時錯誤.

觀察const引用繫結到不同型別時所發生的事情.

double dval=3.14;

const int &ri=dval;

//編譯器會轉化為以下形式**

int temp=dval;

const int &ri=temp;

非const引用只能繫結到與該引用同型別的物件.

const 引用可以繫結到不同但相關的型別的物件或繫結到右值.

使用const 引用的目的是減少中間環節臨時變數的複製

c++任何變數只能定義一次.const物件預設定義它的檔案的區域性變數.當在標頭檔案定義const變數後,每個包含該檔案的原始檔都有了自己的const變數,其名稱和值都一樣.

當const變數時用常量表示式初始化時,可保護真呢過所有的變數都有相同的值.但是在實踐中,大部分的編譯器在編譯時,都會用相應的常量表示式替換這些const變數的使用.在實踐中不會有任何儲存空間用於儲存用常量表示式初始化的const變數.(儲存時用相應的常量表示式的值替換)

說明:常量表示式(const expression)是指值不會改變並且在編譯過程就能得到計算結果的表示式。顯然,字面值屬於常量表示式,用常量表示式初始化的const物件也是常量表示式。後面將會提到,c++語言中有幾種情況下是要用到常量表示式的。

乙個物件(或表示式)是不是常量表示式由它的資料型別和初始值共同決定,例如:

const int max_files = 20;       // max_files是常量表示式  

const int limit = max_files + 1; // limit是常量表示式

int staff_size = 27; // staff_size不是常量表示式

const int sz = get_size(); // sz不是常量表示式

儘管staff_size的初始值是個字面值常量,但由於它的資料型別只是乙個普通int而非const int,所以它不屬於常量表示式。另一方面,儘管sz本身是乙個常量,但它的具體值直到執行時才能獲取到,所以也不是常量表示式。

const double *cptr;

cptr指向double型別const物件的指標,const先頂了cptr指標所指向的物件型別,並非cptr本身.也就是說cptr本身不是const.定義時不需要對齊初始化,並且允許需要時,對cptr重新賦值,指向另外乙個const物件.

將乙個const物件的位址賦值給普通的非const物件的指標也會導致編譯時錯誤.

不能使用void*指標儲存const物件的位址,必須使用const void*型別的指標儲存cons物件的位址.

不能私用指向const物件的指標修改基礎物件,如果該指標指向的是乙個非const物件,可用其他方法修改所指物件..本質上來說沒有方法分辨cptr所指向的物件是否為const,系統會把它所指向的物件視為const.不能保證指向const的指標所指向的物件值一定不可修改.指向const物件的指標可以理解為,自以為指向const物件的指標.

int errnum=0;

int *const curerr=&errnum;

const指標的值不能修改,意味著不能使curerr指向其他物件.任何企圖給const指標賦值的行為.

指標本身是const的事實並沒有說明是否使用該指標修改它所指向物件的值.指標所指向物件的值能否修改完全取決於改物件的型別.

const double db=3.14;

const double * const ptr=&db;

ptr,是乙個const指標,並且是指向const物件.

typedef string *pstring;

const pstring cstr;

cstr是什麼型別?

很多人會認為const string *cstr.這種錯誤的原因是將typedef當做文字的擴充套件了.宣告const pstring時,const修飾的是pstring型別,而pstring型別是乙個指標.所以為const指標.

string *const cstr;

bool same_isbn(const sales_item &rhs)  const

這種函式被稱為成員函式.

const改變了this形參的型別,這裡this形參是指向const 型別 的指標.

在c++中,this指標被隱含地宣告為: x *const this,這意味著不能給this 指標賦值;

在x類的const成員函式中,this指標的型別為:const x* const, 這說明this指標所指向的這種物件是不可修改的(即不能對這種物件的資料成員進行賦值操作).

this是const,this指向的物件也是const,即不能修改指向物件中的成員.

在類體之外定義const成員函式時,還必須加上const關鍵字.

在c++

中,只有被宣告為

const

的成員函式才能被乙個

const

類物件呼叫,

若將成員成員函式宣告為const,則該函式不允許修改類的資料成員,

把乙個成員函式宣告為const可以保證這個成員函式不修改資料成員,但是,如果據成員是指標,則const成員函式並不能保證不修改指標指向的物件

const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員.

const物件,指向const物件的指標或引用只能用於呼叫其const成員函式(上面是成員變數),如果嘗試呼叫呼叫非const成員函式,則是錯誤的.

引用:

c++ primer 第四版和第五版

c const關鍵字總結

const int max size 1024 這是最常見的用法,大家都沒問題,const在定義的時候需要初始化。有兩點需要注意一下 a const變數預設是區域性變數,如果需要全域性訪問,需要顯示地extern b const int max size 1024 與 define max size...

C const 關鍵字總結

c 中關於 const 的知識點很多,在這裡做個總結。const 關鍵字修飾的變數在建立後值就不能改變了,因此必須在建立時進行初始化。物件的型別決定了能夠在物件上進行哪些操作。對 const 物件來說,只能使用那些不能改變物件狀態的操作。如果 const 物件是由乙個編譯時常量 compile ti...

c const關鍵字詳解

正所謂酒足思淫慾,當衣食無憂的時候自然會產生很多的歪想法,就像當官一樣,權力越大,越容易腐敗。effective c 中第三條 盡量使用const。這就說明使用const是有很大的好處的,const就是把權力盡可能控制一下,這樣就會減免很多出bug的機會。因為乙個專案不可能只有乙個人開發,即使是乙個...