const介紹

 
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   )   {   I++;}   //Error不能修改常量I  
2.const修飾函數返回類型用法也是類似於   ①②中,僅僅修飾的對象變化變成一個返回對象  
例如:const   int   Fun()   {   static   int   I;   return   I;}  
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成員函數中被改變。  
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章