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

            對于上面四個條語句,你能說出它們之間的區別嗎?
            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引用。

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

            2008年8月22日

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

            1. 本質區別
            malloc/free是C/C++語言的標準庫函數,new/delete是C++的運算符。
            對于用戶自定義的對象而言,用maloc/free無法滿足動態管理對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free。因此C++需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符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的函數Initialize實現了構造函數的功能,函數Destroy實現了析構函數的功能。函數UseMallocFree中,由于malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成“構造”與“析構”。所以我們不要用malloc/free來完成動態對象的內存管理,應該用new/delete。由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

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

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

            2008年3月3日

            在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。

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

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

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

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

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

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

            僅列出標題  
            99久久国产亚洲高清观看2024 | 久久人人爽人人爽人人片av高请 | 亚洲国产精久久久久久久| 国产精品无码久久久久久| 国产精品久久久久久久久免费| 久久夜色精品国产亚洲| 亚洲精品高清久久| 狠狠色综合久久久久尤物| 国产69精品久久久久久人妻精品| 亚洲色大成网站WWW久久九九| 久久精品国产亚洲综合色| 国产精品久久婷婷六月丁香| 久久婷婷五月综合97色| 91亚洲国产成人久久精品| 亚洲精品国产第一综合99久久| 国产精品99精品久久免费| 伊人久久一区二区三区无码| 久久99国产精品久久| 久久精品国产99久久久古代| 18岁日韩内射颜射午夜久久成人| 中文字幕久久精品无码| 93精91精品国产综合久久香蕉| 久久久久无码精品国产不卡| 日本五月天婷久久网站| 久久99热这里只有精品国产| 成人国内精品久久久久一区| 亚洲色大成网站www久久九| 免费精品久久天干天干| 久久成人国产精品二三区| 久久青青色综合| 久久婷婷色综合一区二区| 国产亚洲精品美女久久久| 欧美大香线蕉线伊人久久| 亚洲精品乱码久久久久久| 久久亚洲精品无码VA大香大香| 日韩久久久久中文字幕人妻| 中文精品久久久久国产网址| 国产呻吟久久久久久久92| 久久久久久极精品久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 日本道色综合久久影院|