C++基本功:全面掌握const、volatile和mutable關鍵字

發表于:2007-07-01來源:作者:點擊數: 標簽:
C++基本功:全面掌握const、volatile和mutable關鍵字 C++程式設計過程中,const的使用可以頻度是非常高的.它在保證程式 安全 方面起到了不可估量的作用. 用一句話來表達最確切不過了:”小兵立大功”. 有了const,那么mutable當然缺不了. 然作為const的同胞兄

     

C++基本功:全面掌握const、volatile和mutable關鍵字


     C++程式設計過程中,const的使用可以頻度是非常高的.它在保證程式安全方面起到了不可估量的作用.
用一句話來表達最確切不過了:”小兵立大功”.
   有了const,那么mutable當然缺不了.
   然作為const的同胞兄弟,volatile卻在很多人的視野中消失.其實volatile擔負的責任有何嘗小呢?
   自然,它們的用法多樣而靈巧,以至新手迷惑久久,下面就來系統的探討總結一下吧:

一.一般應用
1.const修飾各種變量的用法.
   a.取代define
     #define D_INT 100
     #define D_LONG 100.29
     ………
     const int D_INT = 100;
     const D_INT = 100;     //如果定義的int類型,可省略int.
     const long D_LONG = 100.29;
     ………
     const int& a = 100;
     const替代define雖然增加分配空間,可它卻保證了類型安全.
     在C標準中,const定義的數據相當于全局的,而C++中視聲明的位置而定.
   b.修飾指針相關的變量
     以三組簡單的定義示意:
     Group1:  
     int a = 0;   
     const int* b = &a;------------  [1]               
     int const *b = &a;------------  [2]                    
     const int* const b = &a;---- [4]  
         
     Group2: 
     const char *p = "const";--------------[1]
     char const *p = "const";--------------[2]  
     char* const p = "const";--------------[3]  
     const char * const p = "const";----[4]     
    
     Group3:
      int a=0;
        const int &b = a;---------------[1]
     int const &b = a;---------------[2] 
     int & const b = a;--------------[3]  //--->修飾引用時,const被忽略
     const int & const b = a;-----[4]
     總結:
     1.如果const位于星號左側,則const用來修飾指針所指向的變量,
       即指針指向的為不可變的.
     2.如果const位于星號右側,const就是修飾指針本身,即指針本身是
       不可變的.
       因此,[1]和[2]的情況相同,指針所指向內容不可變(const放在變量
       聲明符的位置無關),
       這種情況下不允許對內容進行更改,如不能*a = 3 ;
     3.[3]中指針本身是不可變的,而指針所指向的內容是可變的,這種情況
       下不能對指針本身
       進行更改操作,如a++是錯誤的
     4.[4]中指針本身和指向的內容均為常量.(引用特殊:引用在使用增加
       遇義時,增加它代表的變量.所以qualifiers on reference are ignoredv.
       延伸點:
       注意示例:
       1.const int& reference = 1000;
       2.char* p = "const"
         char*& q ;
  
2.const在函數環境下的各種應用
   常用法示例如下:
   const A&  _Fun(const  A& _in);  //修飾引用型傳入參數
   // A  _Fun(const A& _in);
   //A& _Fun(const A& _in);
   //上面的兩種,在函數內部有特殊的步驟,這里不詳提了…..
 
   const  A*  _Fun( const  A* _in);   //修飾指針型傳入參數
   void _Fun( ) const;   //修飾class成員函數
   const  A&  _Fun(A& _in );  //修飾返回值
   const A & operator(const A& _in);  //同時修飾傳入參數和返回值

   a.修飾參數
     如void _Fun(const A* _in)或 void _Fun(const A& _in);
     它們被修飾后,在函數執行期間行為特性同于上面的講解,
     注意:這不會改變原來數據的是否是const的屬性.

   b.修飾函數返回值
    const A&  _Fun( )
    const A*   _Fun( );
    注意:由于生命期不同步的問題,不可將局部的變量的指針或引用返回(static除外).
    另外,傳出來的視情況,代表不同的意思…
    對于A&返回類型,你若將之賦與其它變量,那么它實際執行的是將返回的變量
    (或引用)代表的數據賦出..而你若將其它值賦予之,那么被賦予的是變量或引
    用代表的數據. 而const A& 一般是防止之做為左值被賦值.

    這個地方還有很多的細節問題(譬如在連續賦值、返回的臨時對象的處理、
    重載的const和非cosnt運算符等等),讀者自己在實踐中需要多多總結.

二、難點
3. 修飾類成員函數的const.
   形如:void _Fun() const { };
   你需要知道的幾點規則:

   a.const對象只能訪問const成員函數,而非const對象可以訪問任意
     的成員函數,包括const成員函數.
   b.const對象的成員是不可修改的,然而const對象通過指針維護的對象卻
     是可以修改的.
   c.const成員函數不可以修改對象的數據,不管對象是否具有const性質.它在
     編譯時,以是否修改成員數據為依據,進行檢查.
   e.然而加上mutable修飾符的數據成員,對于任何情況下通過任何手段
     都可修改,自然此時的const成員函數是可以修改它的…

4.談談volatile和”完全const對象”
  一個有volatile修飾的類只允許訪問其接口的一個子集,這個子集由類的
  實現者來控制.用戶只有用const_cast才可以訪問這個類型的全部接口.而且,
  象const一樣,類的volatile屬性會傳遞給它的成員.想象const修飾的對
  象,它的成員變量是不可修改的,而它通過指針維護的對象或原生變量是可
  修改.那么我們想:如果對象維護一個char* ,則它相當于char*
  const chrptr ;而不是const char* cosnt chrptr;對于類中的指針你需要
  這樣修飾以防止它或它維護的資源:cosnt x* xptr;而不是x*const xptr;
  因為cosnt 修飾的對象它默認 的行為是延續變量:x* cosnt xptr;

  更重要的,volatile修飾的數據,編譯器不可對其進行執行期寄存于寄存器的優化.
  這種特性,是為了多線程同步的需要.有興趣者看參看Andrei的GP系列文章.

5.談談const_cast轉換運算符
  這個關鍵字最基礎的用法是:去掉數據的const性質.
  值得注意的是:它只對指針、引用和其它的具有指向性質的類型.

參考:
    1.《Effective C++ 》關于const兩種語義的論述
    2.Andrei Alexandrescu 《volatile——編寫多線程程序的好幫手》

 


 

 

 

 

 

 


原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97