const 最早想法是用於取代預處理器#define 這個巨集,從而形成常量的概念。針對常量const物件,const指標及指向const的指標,函式const型別引數,const 函式返回型別, const類成員,及const成員函式,及對const最後理解的一些總結來描述 const。
① const物件和const型別的物件
對於這兩個概念的描述如下
1. int const object; //object是乙個const量是不可以被修改 object = 2;error
2. const int object; //object是 const int型他所存放的內容不可以被修改
對於1,2這兩種const用於物件,表述雖然不同但是效果是一樣的。因為物件本身存放著內容對物件的改變就是對於物件內容的改變,同樣改變後者也是在改變前者。所以語義上一樣的。
② const指標 和 指向const的指標 及兩者結合
對於三個概念描述如下
1. int* const p; //指標p是const不能被修改 例如p++; //修改p本身會error
//修改p指向內容 *p = 2; //ok
2. const int* p; //p是指向乙個整形常量的指標指向的內容不可以改變 p++;//ok
// *p = 2; //error
3. const int* const p; //指標p本身是不能被修改並且p所有有效的內容也不能被
//修改 *p = 2; error 和 p++; error
③ const 引數修飾 和 引數返回型別的const修飾
1.const 引數修飾
此時函式引數修飾 const的具體用法 ① ②中用法是一樣的
例如 void fun( const int i ) //error不能修改常量i
2.const修飾函式返回型別用法也是類似於 ①②中,僅僅修飾的物件變化變成乙個返回物件
例如:const int fun()
int res = (fun())++ //error不能修改常量返回物件
④ const類成員 和 const 成員函式
1. const成員
類const成員在構造期間會允許被初始化並且在以後不能被改變。我們就可以知道類const成員和一般const 變數是有所不同的,類const成員是對應於每個物件而言才有意義。因為他在構造期被初始化,只有當類例項化後才會進行構造。所以類const成員可以這樣描述: 在類的每一次例項化時被初始化,在這個物件的生存週期中不可改變。
2. const 成員函式
描述: void class::memberfun() const {}; //此時這個const修飾的this所有類成員變數都不允許在這個函式體作用後被修改。這在設計上會帶來一些好處,能防止你意外的處理帶來的問題。
總結:
<1> const 常量 一般編譯器不會分配空間只是維護一張表。而當extern 外部引用這個常量或者「&」對這個常量取位址時,編譯器才會為其分配位址。const本身的機制比較複雜。
<2> const 記憶法則 const修飾後面乙個最近的名稱。我曾初學的時候被const 修飾搞的糊里糊塗,後來慢慢的總結我覺得這樣理解最容易的。
例子: const int i; 此時const僅僅修飾int 表明 i不是乙個常量但是i的內容是常量。因為c/c++表達 對i的改變就是對i內容的改變所以 i也類似乙個const。大家不妨可以用指標const修飾試試理解會有幫助的我想。
<3> 對於所有非const 型別可以無條件轉化為 const型別,但是後者不能自動轉化為前者除非顯式的強制轉化去掉const性。這樣做是有意義的,因為const型別是非const的乙個子集是一種特殊,由普遍轉化為特殊是合理的,就象模板特化,繼承的向上對映都是有意義的。
<4> 記住所有const修飾的內容並不是永遠不可改變,如果人為的強制轉化編譯器是不會提醒的。因為它沒有義務這麼做,所以我們對其轉化時要小心。
<5> 在const類成員函式處理時,我們引入了mutable修飾類成員變數,經過其修飾的成員變數可以在const類成員函式中被修改,編譯器是允許的。而其他未被mutable修飾的成員還是按照const規則不能在const成員函式中被改變。
const的使用注意
1.const成員變數也不能在類定義處初始化,只能通過建構函式初始化列表進行,const資料成員 只在某個物件生存期內是常量,而對於整個類而言卻是可變的。2.型別說明符 函式名 參數列 const 1 首先const在函式後面,只能應用於類的成員函式。2 const表示在函式的執行過程中不允許修改類...
const使用注意事項
把 讀作pointer to然後從後往前讀.int const p 可以讀作 p is a pointer to const int,p是指向常量的指標 int const p 可以讀作 p is a const pointer to int,p是指向int型的常指標,此時 p的值是可以被修改的,但...
c 常量(const) 使用的注意事項
在我們編碼的過程 const 是我們經常用到的一種宣告型別,如果不了解const的執行機制,有時候會發生一些莫名其妙的bug,可能讓我們掉入深坑中。接下來我們一起看看常量的應用吧!1.常量預設是靜態型別,所以不能和static一起使用 2.常量是在編譯時計算的,它的表示式中不能包含變數 如 cons...