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

            const用法小議

            Posted on 2008-09-04 19:02 阿呆@Rachel 閱讀(1448) 評論(4)  編輯 收藏 引用 所屬分類: C++

            const是C++的關鍵字之一,與其他的關鍵字相比,C++初學者可能對于const的使用會一時摸不著頭腦,若能正確的使用const,將使你的程序更加Robust!


            測試題先行~~

            1 int i = 5;
            2 const int *ip = &i;
            3 int const *ip = &i;
            4 int* const ip = &i;
            5 const int* const ip = &i;

            對于上面四個條語句,你能說出它們之間的區別嗎?
            2)和3)中const修飾的是*ip, 這表明ip所指向的變量i是const的,類似*ip = 1的操作編譯的時候都會報錯;4)const修飾的是ip,說明指針本身是const,修改指針指向的變量是合法的,而類似++ip修改指針本身的操作是違法的;5)指針本身和指向的變量都是const的。

            const的用法主要體現在函數聲明中的應用,它既可以修飾函數參數,還可以修飾函數的返回值,此外對于類的成員函數,它還可以修飾整個函數。下面是一個簡單簡單的二維向量類:

            class Vector2D{
                
            float x, y;
            public:
                Vector2D( 
            float _x = 0float _y = 0 ) : x( _x ), y( _y )
                {}
                Vector2D( 
            const Vector2D &vec ) : x( vec.x ), y( vec.y )  // 修飾參數
                {} 
                
            float GetX() const { return x; }     // 修飾整個函數     
                const Vector2D operator + ( const Vector2D &rval ) const            // 修飾參數,返回值和整個函數
                { return Vector2D( x + rval.x, y + rval.y );   }   
            };

            --const修飾函數參數
            在copy構造函數中,const修飾的是函數的參數,調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參為const Vector2D &vec,則不能對傳遞進來的引用對象的進行改變,從而保護了原對象的屬性。
            [Tips]const通常用于修飾指針或引用類型的參數。

            --const修飾返回值
            在重載的向量加法運算符的函數中,返回值用const修飾,這樣如下的賦值操作就非法的:
            Vector2D vec1, vec2, vec3;
            (vec1+vec2) = vec3;
            [Tips]一般情況下,函數的返回值為某個對象時,如果將其聲明為const時,多用于運算符的重載。通常,函數返回值為某個對象或對象的引用時,不用const來修飾。因為,這樣返回的實例只能訪問public成員和const成員函數,并且賦值操作也是非法的,這樣的用法是非常罕見的。

            --const修飾類的成員函數
            對于Vector2D::GetX()函數,因為它不會修改成員數據,若聲明成const,如果函數實現中修改了成員變量,編譯的時候將報錯,這樣程序會更加的Robust~~

            [Tips]
            a.在你搞清楚const的用法之后,請大膽使用;
            b.在參數中使用const應該使用引用或指針,而不是一般的對象實例;
            c.不要輕易的將函數的返回值類型定為const;
            d.除了重載操作符外一般不要將返回值類型定為對某個對象的const引用。

            Feedback

            # re: const用法小議  回復  更多評論   

            2009-01-09 22:05 by bigcoder
            寫的很好,真的是一針見血,我引用下,謝謝 !

            # re: const用法小議  回復  更多評論   

            2009-03-25 11:51 by qustmao
            總結得不錯,,,,,

            學習了,,,,,

            # re: const用法小議  回復  更多評論   

            2009-09-10 16:36 by 學習者
            很好

            # re: const用法小議  回復  更多評論   

            2009-11-21 18:22 by xiaoyuemian
            贊!受教啦~
            久久99国产综合精品| 伊人久久大香线蕉综合热线| 成人国内精品久久久久影院| 久久国产精品一区二区| 欧洲性大片xxxxx久久久| 日本久久久久亚洲中字幕| 亚洲午夜久久久精品影院| 久久婷婷五月综合成人D啪| 国产欧美一区二区久久| 久久精品国产99久久久古代 | 无码国内精品久久人妻麻豆按摩 | 亚洲国产成人精品女人久久久| 天天爽天天狠久久久综合麻豆 | 久久久久久久波多野结衣高潮| 免费精品99久久国产综合精品| 亚洲中文字幕久久精品无码喷水| 97精品国产97久久久久久免费| 亚洲AV无码久久精品蜜桃| 久久久久人妻一区精品果冻| 91久久精品91久久性色| 久久综合亚洲欧美成人| 久久人人爽人人爽人人片av麻烦 | 久久久久久国产a免费观看黄色大片| 久久99精品国产| 2021久久国自产拍精品| 久久久久久久久66精品片| 伊人久久大香线蕉综合5g| 人妻无码精品久久亚瑟影视| 久久久久亚洲av成人无码电影| 狠狠综合久久综合中文88| 91精品婷婷国产综合久久| 国产精品99久久不卡| 国产成人久久777777| 久久久精品波多野结衣| 久久久精品国产亚洲成人满18免费网站| 国产亚洲欧美成人久久片| 99国产欧美久久久精品蜜芽| 久久青草国产手机看片福利盒子| 国产精品无码久久综合| 伊人久久大香线焦综合四虎| 国产精品日韩欧美久久综合|