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

            chenglong7997

            關于默認構造函數的幾個錯誤認識(四種情況下,編譯器會生成默認構造函數)

             假期間閑來無事,就下載了某大師的VC++視頻資料。在講到C++時,說是如果程序員沒有自己定義默認構造函數,那么編譯器會自動為我們產生一個默認的構造函數。 本來這個錯誤的認識很多程序員都有,不足為奇。但有這么多年編程經驗的高手也有這樣的錯誤認識就不禁讓我啞然了。
                    其實編程語言和我們所用的任何軟件沒有區別,例如Photoshop、AutoCAD之類。其唯一不同的是我們用的編程語言是基于編譯器的,而應用軟件是基于我們的編程語言的。
                    既然我們所用的軟件是基于編譯器的,那么理解編譯器在背后到底為我們做了些什么、在什么情況下做了哪些事情就顯得異常重要。這就像Photoshop會為你產生一些基本圖形例如矩形、三角形之類,而不會憑空產生一些風景優美的圖片一樣。
                    在《C++ Annotated Reference Manual(ARM)[ELLIS90]》中的Section 12.1告訴我們:"Default constructors...在需要的時候被編譯器產生出來"。
                    其實默認構造函數也是分為兩類的:有用的、無用的。
                    所謂有用的標準也是就默認構造函數會為我們的類做一些初始化操作。那么無用的就不會做任何工作,從而對我們的類也就沒有任何意義。所以,我們通常所說的默認構造函數是指有用的默認構造函數,其英文名字叫nontrivial default constructor。
                    那么到底什么時候編譯器會為我們產生nontrivial default constructor呢?有下面四中情況:
                   ①如果一個類里面某個成員對象有nontrivial default constructor,編譯器就會為我們的類產生nontrivial default constructor。
                   那么編譯器這樣做的理由是什么?
                   答案是因為類成員對象有nontrivial default constructor,那么編譯器就需要顯式的來調用這個類成員對象的nontrivial default constructor。而編譯器想顯式的調用類成員對象的nontrivial default constructor,就需要自己來合成一些代碼來調用。但是記住,編譯器合成的nontrivial default constructor僅僅調用類成員對象的默認構造函數,而不對我們類里面的其它變量做任何初始化操作。
                    也就是說,如果你想初始化類成員變量以外的變量例如一個int、一個String,那么必須自己定義默認構造函數來完成這些變量的初始化。而編譯器會對你定義的默認構造函數做相應的擴展,從而調用類成員對象的nontrivial default constructor。
                    ②如果一個派生類的基類有nontrivial default constructor,那么編譯器會為派生類合成一個nontrivial default constructor。
                    編譯器這樣的理由是:因為派生類被合成時需要顯式調用基類的默認構造函數。
                    ③如何一個類里面隱式的含有任何virtual function table(或vtbl)、pointer member(或vptr)。
                    編譯器這樣做的理由很簡單:因為這些vtbl或vptr需要編譯器隱式(implicit)的合成出來,那么編譯器就把合成動作放到了默認構造函數里面。所以編譯器必須自己產生一個默認構造函數來完成這些操作。
                    所以如果你的類里帶有任何virtual function,那么編譯器會為你合成一個默認構造函數。
                    ④如果一個類虛繼承于其它類。
                    編譯器這樣做的理由和③類似:因為虛繼承需要維護一個類似指針一樣,可以動態的決定內存地址的東西(不同編譯器對虛繼承的實現不僅相同)。
                    那么除了以上四種情況,編譯器并不會為我們的類產生默認構造函數。
                    所以編程中切忌想當然,要明白哪些事情是編譯器做的,哪些事情需要程序員來完成的。就像堆所占用的資源需要程序員自己來釋放,而棧空間是編譯器管理的一樣。
                    只有如此,才能編寫出質量更高的代碼。

            posted on 2012-04-01 06:19 Snape 閱讀(1132) 評論(0)  編輯 收藏 引用 所屬分類: C++ 轉載

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            青青青国产成人久久111网站| 一本色道久久综合亚洲精品| 久久国产精品久久国产精品| 久久97久久97精品免视看秋霞| 性高湖久久久久久久久AAAAA | 久久久久亚洲AV无码专区网站| 色偷偷91久久综合噜噜噜噜| 亚洲αv久久久噜噜噜噜噜| 99久久久久| 久久夜色精品国产噜噜麻豆 | 亚洲国产综合久久天堂| 国产午夜福利精品久久2021| 久久久精品国产Sm最大网站| 国产成人无码久久久精品一| 综合久久一区二区三区 | 国产精品99久久精品| 亚洲国产成人久久一区WWW| 999久久久免费精品国产| 国产精品久久久香蕉| 久久国产福利免费| 久久精品国产69国产精品亚洲| 97精品伊人久久久大香线蕉| 色悠久久久久久久综合网| 色综合色天天久久婷婷基地| 国产亚洲精久久久久久无码| 熟妇人妻久久中文字幕| 久久久久99这里有精品10 | 久久99国产精品一区二区| 久久丫忘忧草产品| 亚洲精品WWW久久久久久| 狠狠色伊人久久精品综合网| 久久精品一区二区国产| 久久99国产精品久久| 伊人久久大香线蕉影院95| 精品国产福利久久久| 国产精品99久久精品| 麻豆精品久久精品色综合| 国产一区二区三精品久久久无广告| 91精品国产乱码久久久久久| 97久久久久人妻精品专区 | 国产精品亚洲美女久久久|