• <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 閱讀(1025) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # seo backlinks  回復  更多評論   

            好貼。我必須說,這個職位處理了話題,能真正傳授新的思路。我真的很感激。希望你們繼續發布有用的職位。
            2011-01-11 16:25 | dating website
            超级碰久久免费公开视频| 日韩人妻无码一区二区三区久久 | 久久成人国产精品| 99久久成人国产精品免费| 国产高潮国产高潮久久久91| 亚洲午夜久久久| 久久精品国产亚洲av高清漫画| 高清免费久久午夜精品| 国产精品欧美久久久久天天影视| 色天使久久综合网天天| 91久久精品91久久性色| 欧美午夜精品久久久久久浪潮| 亚洲精品乱码久久久久久蜜桃不卡 | 99久久99久久精品国产| 久久精品国产99久久久古代| 国产精品久久久久9999| 无码八A片人妻少妇久久| 免费观看成人久久网免费观看| 少妇人妻综合久久中文字幕| www亚洲欲色成人久久精品| 久久综合精品国产二区无码| 日本欧美国产精品第一页久久| 91精品国产91久久久久福利| 综合久久精品色| 久久亚洲天堂| 精品欧美一区二区三区久久久 | 麻豆亚洲AV永久无码精品久久 | 国产日韩久久久精品影院首页| 亚洲精品无码专区久久久| 亚洲精品tv久久久久久久久久| 久久美女网站免费| 99999久久久久久亚洲| 亚洲va久久久噜噜噜久久男同| 久久亚洲精品国产精品婷婷| 久久男人中文字幕资源站| 日本久久中文字幕| 欧美一区二区久久精品| 久久综合伊人77777麻豆| 性做久久久久久免费观看| 少妇被又大又粗又爽毛片久久黑人| 久久91精品国产91久久户|