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

            2008年9月4日

            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;

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

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

            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 )  // 修飾參數(shù)
                {} 
                
            float GetX() const { return x; }     // 修飾整個函數(shù)     
                const Vector2D operator + ( const Vector2D &rval ) const            // 修飾參數(shù),返回值和整個函數(shù)
                { return Vector2D( x + rval.x, y + rval.y );   }   
            };

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

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

            --const修飾類的成員函數(shù)
            對于Vector2D::GetX()函數(shù),因為它不會修改成員數(shù)據(jù),若聲明成const,如果函數(shù)實現(xiàn)中修改了成員變量,編譯的時候?qū)箦e,這樣程序會更加的Robust~~

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

            posted @ 2008-09-04 19:02 阿呆@Rachel 閱讀(1450) | 評論 (4)編輯 收藏

            2008年8月22日

            由于編程的習慣,動態(tài)管理內(nèi)存的時候總是用new/delete,malloc/free很少使用,兩者之間的區(qū)別就不是很清楚了。

            1. 本質(zhì)區(qū)別
            malloc/free是C/C++語言的標準庫函數(shù),new/delete是C++的運算符。
            對于用戶自定義的對象而言,用maloc/free無法滿足動態(tài)管理對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構造函數(shù),對象在消亡之前要自動執(zhí)行析構函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權限之內(nèi),不能夠把執(zhí)行構造函數(shù)和析構函數(shù)的任務強加于malloc/free。因此C++需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete。

            class Obj
            {
            public :
                  Obj(
            ) { cout << “Initialization” << endl; }
                  
            ~Obj() { cout << “Destroy” << endl; }
                  
            void Initialize() { cout << “Initialization” << endl; }
                 
            void Destroy() { cout << “Destroy” << endl; }
            };

            void UseMallocFree()
            {
                  Obj  
            *= (obj *) malloc( sizeof( obj ) );     // allocate memory
                  a->Initialize();                                                // initialization
                  
            //
                  a->Destroy();                                                // deconstruction
                  free(a);                                                           // release memory
            }

            void UseNewDelete(void)
            {
                Obj  
            *= new Obj;                                         
                
            //
                delete a;
            }


            類Obj的函數(shù)Initialize實現(xiàn)了構造函數(shù)的功能,函數(shù)Destroy實現(xiàn)了析構函數(shù)的功能。函數(shù)UseMallocFree中,由于malloc/free不能執(zhí)行構造函數(shù)與析構函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來完成“構造”與“析構”。所以我們不要用malloc/free來完成動態(tài)對象的內(nèi)存管理,應該用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

            2. 聯(lián)系
            既然new/delete的功能完全覆蓋了malloc/free,為什么C++還保留malloc/free呢?因為C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構函數(shù)而可能導致程序出錯。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete,malloc/free必須配對使用。

            posted @ 2008-08-22 09:06 阿呆@Rachel 閱讀(806) | 評論 (0)編輯 收藏

            2008年3月3日

            在C++中,內(nèi)存分成5個區(qū),他們分別是堆、棧、自由存儲區(qū)、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。

            ***棧***
            那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等;

            ***堆***
            那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那么在程序結束后,操作系統(tǒng)會自動回收;

            ***自由存儲區(qū)***
            那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的;

            ***全局/靜態(tài)存儲區(qū)***
            全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū);

            ***常量存儲區(qū)***
            是一塊比較特殊的存儲區(qū),他們里面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)

            posted @ 2008-03-03 19:10 阿呆@Rachel 閱讀(310) | 評論 (0)編輯 收藏

            僅列出標題  
            久久精品人妻一区二区三区| 欧美777精品久久久久网| 成人a毛片久久免费播放| 精品久久久久久无码人妻蜜桃| 久久精品国产国产精品四凭| 午夜精品久久久久久| 亚洲综合伊人久久综合| 久久福利青草精品资源站免费| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久这里都是精品| 无码人妻久久一区二区三区免费| 99精品久久精品一区二区| 久久久久久亚洲精品不卡| 天堂久久天堂AV色综合| 久久国产三级无码一区二区| 一本久久a久久精品亚洲| 久久国产精品二国产精品| 日产精品久久久久久久| 久久精品国产99久久香蕉| 国产成人久久激情91| 久久久亚洲欧洲日产国码是AV| 色噜噜狠狠先锋影音久久| 97精品依人久久久大香线蕉97| 狠狠色综合久久久久尤物| 久久99精品国产麻豆| 欧美黑人激情性久久| 三级片免费观看久久| 国产99久久九九精品无码| 久久99国产精品一区二区| 精品少妇人妻av无码久久| 久久久久久久精品妇女99| 狠狠色丁香久久婷婷综合_中| 久久精品成人一区二区三区| 国产成人香蕉久久久久| 国产精品久久久久久吹潮| 97精品依人久久久大香线蕉97| 久久久久久国产精品美女| 久久久久国产精品人妻| 亚洲国产精品无码久久久不卡 | 国产精品久久成人影院| 久久无码AV一区二区三区|