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

            關(guān)于默認(rèn)構(gòu)造函數(shù)的幾個(gè)錯(cuò)誤認(rèn)識(shí)(四種情況下,編譯器會(huì)生成默認(rèn)構(gòu)造函數(shù))

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

            posted on 2012-04-01 06:19 Snape 閱讀(1131) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++ 轉(zhuǎn)載

            導(dǎo)航

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

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            my

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久综合给合综合久久| 狠狠色丁香久久婷婷综| 99久久综合狠狠综合久久| 日韩精品无码久久久久久| 久久婷婷五月综合成人D啪| 久久人搡人人玩人妻精品首页| 久久国产精品-国产精品| 国产精品久久久久无码av| 久久99国产精品久久| 久久综合九色综合97_久久久| 国产午夜免费高清久久影院 | 久久亚洲精精品中文字幕| 久久精品国产男包| 亚洲国产精品无码久久久不卡 | 亚洲国产成人乱码精品女人久久久不卡 | 国产精品女同久久久久电影院| 久久99精品久久久久子伦| 久久精品国产99国产精品澳门| 中文字幕久久欲求不满| 亚洲精品tv久久久久久久久久| 一本色道久久综合狠狠躁| 久久久久99精品成人片欧美| 亚洲成人精品久久| 中文字幕无码av激情不卡久久| 99久久国产精品免费一区二区| 2021少妇久久久久久久久久| 精品久久久久久久中文字幕| 久久精品免费一区二区| 天天久久狠狠色综合| 亚洲国产成人精品女人久久久| 无码精品久久久天天影视| 91精品国产色综久久| 久久无码专区国产精品发布| 91精品国产乱码久久久久久| 久久性精品| 欧美激情精品久久久久| 久久久亚洲裙底偷窥综合| 久久精品国产一区二区| 97久久超碰成人精品网站| 久久久久久久免费视频| 国产精品亚洲美女久久久|