const的使用和注意

2021-09-30 03:32:31 字數 2438 閱讀 5276

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...