單獨說說const關鍵字

2021-10-04 11:36:26 字數 2670 閱讀 9731

const是c++ 中常用的型別限定符,但我在工作中卻發現,許多人使用它僅僅是想當然,這樣有時也會用對,但在某些微妙的場合,可就沒有那麼幸運了。

究其實質原由,大多因為沒有搞清const 型別限定符的本質。這裡我將對const 型別限定符進行乙個分析,溯其本源究其本質,希望對大家理解const 有所幫助。

c++中為什麼要引入 const

c++ 的作者當初是出於怎樣的目的引入(或稱保留) const 關鍵字的呢?   這是乙個有趣又有益的話題,對理解 const 很有幫助。

1。大家知道,c++ 有乙個型別嚴格的編譯系統,這使得c++ 程式的錯誤在編譯階段即可發現許多,從而使出錯率大為減少,

也因此 成為了c++ 與 c 相比有些突出優點的乙個方面。

2。c 中很常見的預處理指令 #define  variablename    variablevalue  可以很方便地進行值替換,這種替換在至少在以下三個方面

優點表現突出:

鑑於以上的優點,這種預定義指令的使用在程式中隨處可見。

預處理語句雖然有些以上所述的許多優點,但它也有個比較致命的缺點。即,預處理語句僅僅只是簡單的值替換,缺少型別的檢測機制。

這樣的預處理語句就可能享受 c++ 嚴格型別檢查的好處,從而可能成為引發一系列錯誤的隱患。

4。好了,第一階段結論好了:

結論:   const 說明符推出的初始目的,就是為了取代預編譯指令 #define ,在繼承其優點的同時消除它的缺點。

現在的它形式變成了:

const   tpye  variablename = variablevalue;

為什麼 const 可以很好地取代預定義語句呢?  請看

1、首先,以const  說明符修飾的常量值具有不可變性。這是它可取代預定義語句的基礎。

2、第二,它也同樣可以避免意義模糊的數字出現,使得程式語義清晰的同時可以很方便地對引數進行調整與修改。

3、第三,c++ 編譯器一般不為普通 const 常量分配儲存空間,而是將們儲存在符號表中,這使得它真正成為了乙個編譯期間常量。

由於 沒有了儲存與讀記憶體的操作,這使得它的效率也很高。這是它取代預定義語句的重要基礎。

4、最後,const  定義也同一般普通的變數定義一樣,它會由編譯器對它進行型別的檢測。消除了預定義語句的隱患。

const 說明符使用情況分類詳析

1。const 說明符用於指標的兩種情況分析:

int   a ;

const  int   *p ;               //  指標型別為 const   int *, 指標指向型別為 const int  。指標變數為非 const 型別,但指向的的變數為 const 型別

int  *const  p = &a  ;      //  指標型別為int   *const , 指標指向   int  。指標變數為 const 型別,指向的變數為 非const 型別

const 型別指標的轉換問題:

1.、從" const 指標型別 " 到 " 非const 指標型別 " 的轉換:

除了 const char * 指標型別 可轉換為 char * 型別外(這是為了對c語言的向下相容)  ,

任何的 const  type1 * 都不可轉換為 type2 * 型別。

2、從 " 非const 指標型別 " 到 " const 指標型別 " 的轉換:

這樣的轉換都是可以執行的。

2。const 說明符限定函式的傳遞值引數:

void  fun( const  int  var);

分析:上述寫法限定了引數var不可在函式體內改變。而由值傳遞的特點可知,就算var在函式體中改變了也不會影響到函式外部。

所以,此限定與函式的使用者無關,僅與函式的編寫者有關。

結論:最好在函式的內部進行限定,對外部呼叫者遮蔽以免引起困惑。如可改寫如下:

void fun( int var)

const int &varalias = var;

3。const  限定函式的返回值型別

const    int     fun1();

const    myclass    fun2();

const    int    &fun3();               

cosnt    int    *fun4();

const    myclass   &fun5();    

const   myclass    *fun6();

分析:上述寫法僅限定函式的返回值不可被改寫。

1.當函式返回為內建型別的資料時,那已經是乙個數值,那是必定不可改寫的,這時的const 可要可不要。但建議去掉。

2.當函式返回為自定義型別的物件,這時的物件仍然可能包含可被賦值的資料成員,所以此時有意義。

3.如返回的是乙個引用或是指標時,這種情況最為常見,由位址變數的特點可知,適當使用const ,意義昭然。

4。const  限定類的成員函式

class classname

注意:採用這種const 後置的形式是一種規定,也是為了不引起混淆。在這個函式的宣告和定義中均要使用const,因為const已經成為型別資訊的一部分。 

獲得能力:可以操作常量物件。

失去能力:不能修改類的資料成員,不能在函式中呼叫其他不是const的函式。

Entity SQL 說說IN關鍵字

entity sql esql 是專門為ado.net entity framework ef 提供查詢更新資料而產生的,也就是esql是ef的附屬部件。esql大大提高了ef的使用性,我們就可以像使用sql查詢table一樣很方便地對ef生成的實體集合,儘管它還是載入配置檔案,把esql轉化成sq...

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

關鍵字const詳解

關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...