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

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 164699
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            常量函數(shù)、常量引用參數(shù)、常量引用返回值[C++]

            1. 關(guān)于常量引用
            正像在C語(yǔ)言中使用指針一樣,C++中通常使用引用
            有一個(gè)函數(shù)
            ... foo()
            并且這個(gè)函數(shù)返回一個(gè)引用...
            ... & foo()
            ...., 一個(gè)指向位圖(Bitmap)的引用 ...
            Bitmap & foo()
            .... 并且這個(gè)位圖(bitmap)是常量
            const Bitmap & foo ()

            當(dāng)然你也可以用指針來(lái)做同樣的事情:
            const Bitmap * foo()
            foo 返回一個(gè)指針 ... 指向一個(gè)Bitmap ... 并有這個(gè)Bitmap是個(gè)常量.
            Bitmap * const foo()
            foo 返回某個(gè)東西,這個(gè)東西是常量 ... 這個(gè)東西又是指針 ... 一個(gè)指向Bitmap的指針.
            const Bitmap * const foo()
            foo 返回某個(gè)東西,這個(gè)東西是常量 ... 這個(gè)東西又是指針 ... 一個(gè)指向Bitmap的指針.
            ....
            并且這個(gè)Bitmap也是常量.
            指針常量與常量指針請(qǐng)參考Blog: http://www.cnblogs.com/JCSU/articles/1019219.html

            const總是針對(duì)它左邊的東西起作用, 唯一例外的是,如果const是一個(gè)最左邊的標(biāo)識(shí)符,那么const將針對(duì)它右邊的東西起作用,因些 const int i; 與 int const i; 意思是相同的.
            原文請(qǐng)參考: http://www.thescripts.com/forum/thread63796.html

            2. 常量函數(shù)、常量引用參數(shù)、常量引用返回值
            例1:bool verifyObjectCorrectness(const myObj &obj); //const reference parameter
            例2:void Add(const int &arg) const; //const function
            例3:IStack const & GetStack() const { return _stack; } //return const reference

            常量引用參數(shù)
            本例中,一個(gè)myObj類型的對(duì)象obj通過(guò)引用傳入函數(shù)verifyObjectCorrectness。為安全起見,使用了const關(guān)鍵字來(lái)確保函數(shù)verifyObjectCorrectness不會(huì)改變對(duì)象obj所引用的對(duì)象的狀態(tài)。此外,通過(guò)聲明參數(shù)常量,函數(shù)的使用者可以確保他們的對(duì)象不會(huì)被改變,也不必?fù)?dān)心在調(diào)用函數(shù)時(shí)帶來(lái)副作用。以下代碼試圖對(duì)聲明為常量引用的形參進(jìn)行修改,從而不會(huì)通過(guò)編譯!

            #include <iostream>
            using namespace std;

            class Test
            {
            public:
                
            void f(const int& arg);
            private:
                
            int value; 
            }
            ;
              
            void Test::f(const int& arg) {
                arg=
            10; //試圖修改arg的值,此行將引起編譯器錯(cuò)誤 //error C2166: l-value specifies const object
                cout<<"arg="<<arg<<endl; 
                value
            =20;
            }
              

            void main()
            {
              
            int i=7;
              Test test;
              test.f(i);
              cout
            <<"i="<<i<<endl; 
            }

            常量函數(shù)
            1. 一個(gè)函數(shù)通過(guò)在其后面加關(guān)鍵字const,它將被聲明為常量函數(shù)
            2. 在C++,只有將成員函數(shù)聲明為常量函數(shù)才有意義。帶有const作后綴的常量成員函數(shù)又被稱為視察者(inspector),沒(méi)
                有const作后綴的非常量成員函數(shù)被稱為變異者(mutator)
            3. 與const有關(guān)的錯(cuò)誤總是在編譯時(shí)發(fā)現(xiàn)
            4. [摘]If the function is not declared const, in can not be applied to a const object, and the compiler will 
                     give an error message. A const function can be applied to a non-const object
            5. 在C++中,一個(gè)對(duì)象的所有方法都接收一個(gè)指向?qū)ο蟊旧淼碾[含的this指針;常量方法則獲取了一個(gè)隱含的常量this指針
                void func_name() const;
                以上說(shuō)明函數(shù)func_name()不會(huì)改變*this。當(dāng)你把this指針看成函數(shù)func_name()的一個(gè)不可見參數(shù)就理解了
                void func_name(T *this) (no const)
                void func_name(const T *this) (const)
            6. 常量函數(shù)可以被任何對(duì)象調(diào)用,而非常量函數(shù)則只能被非常量對(duì)象調(diào)用,不能被常量對(duì)象調(diào)用,如:

            class Fred {
             
            public:
               
            void inspect() const;   // This member promises NOT to change *this
               void mutate();          // This member function might change *this
             }
            ;
             
             
            void userCode(Fred& changeable, const Fred& unchangeable)
             
            {
               changeable.inspect();   
            // OK: doesn't change a changeable object
               changeable.mutate();    // OK: changes a changeable object
             
               unchangeable.inspect(); 
            // OK: doesn't change an unchangeable object
               unchangeable.mutate();  // ERROR: attempt to change unchangeable object
             }
             

             

            #include <iostream>
            using namespace std;

            struct A
            {
                void
             f() const { cout<<"const function f is called"<<endl; }
                
            void f() { cout<<"non-const function f is called"<<endl; }
                
            void g() { cout<<"non-const function g is called"<<endl; } 
            }
            ;

            void main()
            {
                A a;
                
            const A& ref_a = a;
                a.f(); 
            //calls void f()
                ref_a.f();//calls void f () const
                a.g(); //ok, normal call
                ref_a.g(); //error, const object can not call non-const function
            }

            7. 在類中允許存在同名的常量函數(shù)和非常量函數(shù),編譯器根據(jù)調(diào)用該函數(shù)的對(duì)象選擇合適的函數(shù)
                當(dāng)非常量對(duì)象調(diào)用該函數(shù)時(shí),先調(diào)用非常量函數(shù);
                當(dāng)常量對(duì)象調(diào)用該函數(shù)時(shí),只能調(diào)用常量函數(shù);
                如果在類中只有常量函數(shù)而沒(méi)有與其同名的非常量函數(shù),則非常量與常量對(duì)象都可調(diào)用該常量函數(shù);如:   

            #include <iostream>
            using namespace std;

            struct A
            {
                
            void f() const { cout<<"const function f is called"<<endl; }
                
            void f() { cout<<"non-const function f is called"<<endl; }
            }
            ;

            void main()
            {
                A a;
                
            const A& ref_a = a;
                a.f(); //calls void f()
                ref_a.f();//calls void f () const
            }

            輸出結(jié)果:
            non-const function f is called
            const function f is called

            #include <iostream>
            using namespace std;

            struct A
            {
                
            void f() const { cout<<"const function f is called"<<endl; }
            }
            ;

            void main()
            {
                A a;
                
            const A& ref_a = a;
                a.f(); 
            //calls void f() const
                ref_a.f();//calls void f () const
            }

            輸出結(jié)果:
            const function f is called
            const function f is called

            8. 以下代碼試圖修改類的數(shù)據(jù)成員,引起編譯錯(cuò)誤

            #include <iostream>
            using namespace std;

            class Test
            {
            public:
                
            void f(const int& arg) const;
            private:
                
            int value; 
            }
            ;
              
            void Test::f(const int& arg) const{
                
            //arg=10; 
                cout<<"arg="<<arg<<endl; 
                value
            =20; //試圖修改Test的數(shù)據(jù)成員,此行將引起編譯器錯(cuò)誤 //error C2166: l-value specifies const object
            }
              

            void main()
            {
              
            int i=7;
              Test test;
              test.f(i);
              cout
            <<"i="<<i<<endl; 
            }

            9. const關(guān)鍵字不能用在構(gòu)造函數(shù)與析構(gòu)函數(shù)中。因?yàn)闃?gòu)造函數(shù)的目的是初始化域值,因此它必須更改對(duì)象,析構(gòu)函數(shù)同理

            常量引用返回值
            如果你想從常量方法(函數(shù))中通過(guò)引用返回this對(duì)象的一個(gè)成員, 你應(yīng)該使用常量引用來(lái)返回它,即const X&
            也就是說(shuō)你想通過(guò)引用返回的東西如果從邏輯上來(lái)講是this對(duì)象的一部分(與它是否在物理上嵌入在this對(duì)象中無(wú)關(guān)),那么常量方法需要通過(guò)常量引用或者通過(guò)值來(lái)返回,而不能通過(guò)非常量引用返回
            原文請(qǐng)參考:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10
            class Person {
            public:
                
            const string& name_good() const// Right: the caller can't change the name
                string& name_evil() const;       // Wrong: the caller can change the name
                .
            }
            ;

            void myCode(const Person& p) // You're promising not to change the Person object
            {
                p.name_evil() 
            = "Igor";  // but you changed it anyway!!
            }

            posted on 2009-04-22 23:09 pear_li 閱讀(807) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

            久久精品无码一区二区三区免费| 93精91精品国产综合久久香蕉| 国产视频久久| 欧美久久综合性欧美| 国内精品久久久久影院优| 少妇高潮惨叫久久久久久| 久久天天躁夜夜躁狠狠躁2022| 亚洲精品国产综合久久一线| 久久久青草青青国产亚洲免观| 国产99久久久国产精免费| 91精品国产高清久久久久久国产嫩草| 97久久精品无码一区二区| 国产精品一区二区久久| 情人伊人久久综合亚洲| segui久久国产精品| 久久国产V一级毛多内射| 欧美久久亚洲精品| 性做久久久久久久久久久| 久久亚洲熟女cc98cm| 亚洲AV日韩精品久久久久久久| 久久婷婷五月综合97色一本一本| 亚洲AV乱码久久精品蜜桃| 97久久香蕉国产线看观看| 久久国产免费观看精品| 久久国产视频99电影| 婷婷久久五月天| 久久精品亚洲一区二区三区浴池 | 久久精品国产亚洲av高清漫画| 人妻无码αv中文字幕久久| 久久青草国产精品一区| 国内精品久久久久久麻豆| 日韩电影久久久被窝网| 无码AV中文字幕久久专区| 久久精品国产69国产精品亚洲| 久久精品国产精品亚洲艾草网美妙| 久久这里的只有是精品23| 久久一日本道色综合久久| 国产精品99久久久久久www| 偷偷做久久久久网站| 久久精品国产69国产精品亚洲| 日韩美女18网站久久精品|