在全域性作用於里定義非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的機會。因為乙個專案不可能只有乙個人開發,即使是乙個...