• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            C++基本功:全面掌握const、volatile和mutable關(guān)鍵字

            C++ 基本功:全面掌握 const volatile mutable 關(guān)鍵字


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

            . 一般應用
            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 定義的數(shù)據(jù)相當于全局的 , C++ 中視聲明的位置而定 .
            ?? b.
            修飾指針相關(guān)的變量
            ????
            以三組簡單的定義示意:
            ???? 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]
            ????
            總結(jié):
            ???? 1.
            如果 const 位于星號左側(cè) , const 用來修飾指針所指向的變量 ,
            ??????
            即指針指向的為不可變的 .
            ???? 2.
            如果 const 位于星號右側(cè) ,const 就是修飾指針本身 , 即指針本身是
            ??????
            不可變的 .
            ??????
            因此 ,[1] [2] 的情況相同 , 指針所指向內(nèi)容不可變 (const 放在變量
            ??????
            聲明符的位置無關(guān) ),
            ??????
            這種情況下不允許對內(nèi)容進行更改 , 如不能 *a = 3 ;
            ???? 3.[3]
            中指針本身是不可變的,而指針所指向的內(nèi)容是可變的 , 這種情況
            ??????
            下不能對指針本身
            ??????
            進行更改操作 , a++ 是錯誤的
            ???? 4.[4]
            中指針本身和指向的內(nèi)容均為常量 .( 引用特殊:引用在使用增加
            ??????
            遇義時 , 增加它代表的變量 . 所以 qualifiers on reference are ignoredv.
            ??????
            延伸點 :
            ??????
            注意示例 :
            ?????? 1.const int& reference = 1000;
            ?????? 2.char* p = "const"
            ???????? char*& q ;
            ??
            2.const
            在函數(shù)環(huán)境下的各種應用
            ??
            常用法示例如下:
            ?? const A&? _Fun(const? A& _in);? //
            修飾引用型傳入?yún)?shù)
            ?? // A? _Fun(const A& _in);
            ?? //A& _Fun(const A& _in);
            ?? //
            上面的兩種 , 在函數(shù)內(nèi)部有特殊的步驟 , 這里不詳提了… ..
            ?
            ?? const? A*? _Fun( const? A* _in);?? //
            修飾指針型傳入?yún)?shù)
            ?? void _Fun( ) const;?? //
            修飾 class 成員函數(shù)
            ?? const? A&? _Fun(A& _in );? //
            修飾返回值
            ?? const A & operator(const A& _in);? //
            同時修飾傳入?yún)?shù)和返回值

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

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

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

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

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

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

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

            5. 談談 const_cast 轉(zhuǎn)換運算符
            ?
            這個關(guān)鍵字最基礎的用法是:去掉數(shù)據(jù)的 const 性質(zhì) .
            ?
            值得注意的是:它只對指針、引用和其它的具有指向性質(zhì)的類型 .

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

            posted on 2006-08-02 12:00 楊粼波 閱讀(1107) 評論(0)  編輯 收藏 引用 所屬分類: C++

            久久99精品国产麻豆| 99久久国产热无码精品免费久久久久 | 无码人妻久久一区二区三区蜜桃| 亚洲va久久久久| 久久精品成人免费看| 久久久黄色大片| 日韩精品久久久久久| 伊人久久久AV老熟妇色| 九九热久久免费视频| 国产午夜精品理论片久久影视 | 亚洲欧美一级久久精品| 久久国产亚洲精品无码| 久久久WWW成人免费毛片| 久久精品9988| 精品国产VA久久久久久久冰| 亚洲欧洲久久久精品| 国产精品无码久久综合网| 国产美女久久精品香蕉69| 久久人人爽人人爽人人片AV高清 | 久久精品极品盛宴观看| 久久综合综合久久97色| 久久久久亚洲AV成人片| 精品一二三区久久aaa片| 精品欧美一区二区三区久久久| 久久精品国产只有精品66| 77777亚洲午夜久久多喷| 午夜久久久久久禁播电影| 久久亚洲精品国产精品婷婷| 久久久艹| 久久er国产精品免费观看8| 久久久99精品一区二区 | 久久人人超碰精品CAOPOREN | 久久无码AV中文出轨人妻| 色噜噜狠狠先锋影音久久| 91精品国产综合久久香蕉| 人人狠狠综合久久亚洲88| 久久精品亚洲男人的天堂| 久久伊人影视| 午夜精品久久久久久中宇| 97久久精品无码一区二区天美| 欧美久久综合性欧美|