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

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            C++之Destructors(析構函數)

            Destructors實質是釋放資源;
            類的析構執行順序是先構造(Constructed)的(成員),最后被Destructors,數組成員同樣如此,例如:數組a[0], a[1], ..., a[8], a[9]: 析構執行順序是a[9], a[8], ..., a[1], a[0]:不能有參數,不能有返回值,不能重載;只能在(對象關閉)自動調用,不能顯示調用析構函數(除非placement new),不可以調用兩次。
            值得注意的是不能顯式調用析構函數,即使局部變量也不行。此時我們需要這樣處理:
            void someCode()
             {
               {
                 File f;
                ...........
               }
             // f 的析構函數在此處會被自動調用!
             }
            如果上述的方案還是不可行,我們可以考慮增加一個和析構函數等效的成員方法,例如:我們常見File類,就可增加一個Close()成員方法,但是要記住和析構函數一樣,不能聯系調用兩次,我們可以將一個fileHandle_數據成員設置為 -1,并且在開頭檢查fileHandle_是否已經等于-1;
            class File {
             public:
               void close();
               ~File();
               ...
             private:
               int fileHandle_;   
            // fileHandle_ >= 0 if/only-if it's open
             };
             
             File::~File()
             {
               close();
             }
             
             void File::close()
             {
               if (fileHandle_ >= 0) {
                 
            ...insert code to call the OS to close the file...
                 fileHandle_ = -1;
               }
             }
            如果一個對象是new的,那么在delete中也不能顯示調用析構函數,因為delete做了兩件事,調用析構銷毀對象和釋放空間。這里的new可不是operator new,后者只是分配空間,并沒調用構造函數。
            placement最明顯的作用就是把對象放到特定的內存位置。

            #include <new>        // Must #include this to use "placement new"
             #include "Fred.h"     
            // Declaration of class Fred
             
             void someCode()
             {
               char memory[sizeof(Fred)];     
            // Line #1
               void* place = memory;          
            // Line #2
             
               Fred* f = new(place) Fred();   
            // Line #3 (see "DANGER" below)
               
            // The pointers f and place will be equal
             
               
            ...
             }
            Line #3中的構造函數中的this指針將等于place,f的返回值也是place,注意:placenew指向的指針要有足夠的空間,并且需要為所創建的對象進行邊界調整,編譯器和系統不會對此進行任何檢查,另外placenew的析構應該像如下這樣編寫:
            void someCode()
             {
               char memory[sizeof(Fred)];
               void* p = memory;
               Fred* f = new(p) Fred();
               ...
               f->~Fred();   
            // Explicitly call the destructor for the placed object
             }
            在編寫析構函數時,也不能顯正調用成員的析構函數,類的析構函數會自動調用成員的析構,按照和它們在類中的聲明的順序相反的順序被析構。
            在派生類的析構中,不能顯式調用基類的析構。派生類的析構會自動調用基類的析構函數。在多重繼承的情況下,直接基類以出現在繼承列表中的順序的反序被析構。

            posted on 2010-11-26 00:18 Benjamin 閱讀(1035) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # seo backlinks  回復  更多評論   

            好貼。我必須說,這個職位處理了話題,能真正傳授新的思路。我真的很感激。希望你們繼續發布有用的職位。
            2011-01-11 16:25 | dating website
            2021久久国自产拍精品| 国产福利电影一区二区三区,免费久久久久久久精 | 一本综合久久国产二区| 99久久精品国产一区二区| 亚洲欧美成人综合久久久| 亚洲乱亚洲乱淫久久| 99久久国产亚洲综合精品| 久久精品国产亚洲av影院| 精品人妻伦九区久久AAA片69| 77777亚洲午夜久久多人| 91久久国产视频| 久久人人爽人人爽人人片AV不| 97精品伊人久久久大香线蕉| yy6080久久| 无码人妻久久一区二区三区蜜桃| 97久久久精品综合88久久| 久久人人爽人人爽人人片AV不| 日韩精品久久久久久| 人妻无码αv中文字幕久久琪琪布| 久久久久国产精品麻豆AR影院| 久久国产欧美日韩精品| 亚洲综合伊人久久综合| 中文字幕精品无码久久久久久3D日动漫| 久久久久亚洲精品无码蜜桃| 日韩欧美亚洲综合久久| 国内精品久久久久久久影视麻豆 | 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 久久无码专区国产精品发布| 一本久久a久久精品综合夜夜| 久久国产精品99国产精| 伊人久久大香线蕉综合Av| 亚洲国产日韩欧美久久| 久久影院亚洲一区| 亚洲精品tv久久久久| 亚洲国产精品成人AV无码久久综合影院| 激情五月综合综合久久69| 国产午夜电影久久| 久久综合给合综合久久| 四虎影视久久久免费| 青青热久久国产久精品 | 伊人久久大香线蕉精品|