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

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 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 閱讀(1029) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # seo backlinks  回復  更多評論   

            好貼。我必須說,這個職位處理了話題,能真正傳授新的思路。我真的很感激。希望你們繼續發布有用的職位。
            2011-01-11 16:25 | dating website
            久久人人爽人人爽人人爽| 国产亚洲美女精品久久久2020| 少妇人妻88久久中文字幕| 亚洲狠狠婷婷综合久久久久| av午夜福利一片免费看久久| 99久久国产亚洲高清观看2024 | 欧美亚洲国产精品久久| 久久久久se色偷偷亚洲精品av| 国产成人无码久久久精品一| 韩国三级中文字幕hd久久精品| 波多野结衣久久一区二区| 久久精品国产亚洲沈樵| 久久婷婷五月综合成人D啪 | 久久精品18| 久久精品国产亚洲AV香蕉| 久久精品国产亚洲5555| 日韩精品久久久肉伦网站| 久久久久99精品成人片三人毛片| 久久久高清免费视频| 丰满少妇人妻久久久久久4| 中文字幕久久波多野结衣av| 久久福利片| 亚洲国产成人久久精品动漫| 国内精品久久久久影院薰衣草| 久久国产精品偷99| a高清免费毛片久久| 伊人久久大香线蕉av不卡| 久久久久国产| 久久久久久亚洲精品不卡| 99久久国产综合精品成人影院| 色诱久久久久综合网ywww| 伊人久久大香线蕉综合Av| 久久AV高潮AV无码AV| 国产精品中文久久久久久久| 亚洲欧洲中文日韩久久AV乱码| 久久99精品九九九久久婷婷| 久久99精品国产麻豆不卡| 久久夜色精品国产亚洲av| 久久国产视屏| 中文精品99久久国产| 色综合久久夜色精品国产|