• <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>
            隨筆 - 27  文章 - 88  trackbacks - 0
            <2008年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(4)

            文章分類(3)

            文章檔案(3)

            搜索

            •  

            積分與排名

            • 積分 - 130397
            • 排名 - 198

            最新評論

            閱讀排行榜

            評論排行榜

             

            第二章 構(gòu)造函數(shù)語意學(the semantics of constructors

            21 Default Construcor 的建構(gòu)操作

            有四種情況,會導致“編譯器必須為未聲明constructor class 合成一個 Default constructor . C++ Stardand 把那些合成物稱為implicit nontrivial default constructor .被合成出來的的constructor 只能滿足編譯器(而非程序)的需求。它之所以能夠完成任務,是借著“調(diào)用member object base class default constructor ”或是“為每一個object 初始化其virtual function 機制或virtual base class 機制” 而完成。至于沒有存在那四種情況而又沒有聲明任何constructor classes ,我們說它們擁有的是 implicit trivial constructors, 它們實際上并不會被合成出來。

                   在合成的default constructor 中,只有base class subobjects member class objects h會被初始化。所有其它的nonstatic data member ,如整數(shù)、整數(shù)指針、整數(shù)數(shù)組等等都不會被初始化。這些初始化操作對程序而言或許有需要,但對編譯器則并非必要。如果程序需要一個“把某指針設為0default construct, 那么提供它的人應該是程序員。

                   C++新手一般有兩個常見的誤解:

            1. 任何class 如果沒有定義default constructor ,就會被合成出一個來。

            2. 編譯器合成出來的default constructor 會明確設定“class 內(nèi)每一個data member 的默認值”。

            2.2 Copy constructor 的建構(gòu)操作

                   是一種特殊構(gòu)造函數(shù),具有單個形參,該形參(常用CONST修飾)是對該類類型的引用。當定義一個新對象并用一個同類型的對象對它進行初始化時,將顯式使用拷貝構(gòu)造函數(shù)。當將該類型的對象傳遞給函數(shù)或從函數(shù)返回該類型的對象時,將隱式使用拷貝構(gòu)造函數(shù)。

             

            合成的拷貝構(gòu)造函數(shù):      

            即使我們定義了其他構(gòu)造函數(shù),也會合成拷貝構(gòu)造函數(shù)。合成拷貝構(gòu)造函數(shù)的行為是,執(zhí)行逐個成員初始化(memberwise initialize),將新對象初始化為原對象的副本。

            所謂“逐個成員”,指的是編譯器將現(xiàn)有對象的每個非static 成員,依次復制到正創(chuàng)建的對象。只有一個例外,每個成員的類型決定了復制該成員的含義。合成拷貝構(gòu)造函數(shù)直接復制內(nèi)置類型成員的值,類類型成員使用該類的拷貝構(gòu)造函數(shù)進行復制。數(shù)組成員的復制是個例外。雖然一般不能復制數(shù)組,但如果一個類具有數(shù)組成員,則合成拷貝構(gòu)造函數(shù)將復制數(shù)組。復制數(shù)組時合成拷貝構(gòu)造函數(shù)將復制數(shù)組的每一個元素。

             

            注意:按位拷貝不會分配新的內(nèi)存空間而只是簡單地將該地址的值復制給另一個指針,所以就會出現(xiàn)兩個指針指向同一塊內(nèi)存區(qū)域。

            不要Bitwise Copy Semantics!

            什么時候一個Class 不展現(xiàn)出“Bitwise Copy Semantics”呢?有四種情況:

            1. class 內(nèi)含一個member object 而后者的class 聲明有一個copy constructor

            2. class 繼承自一個base class 而后者存在存在有一個copy constructor 時(再次強調(diào),不論是被明確聲明或是被合成而得)。

            3. class 聲明一個或多個 virtual function 時。

            4. class 派生自一個繼承串鏈,其中有一個或多個virtual base classes時。

            posted on 2008-05-23 09:04 Macaulish 閱讀(1754) 評論(2)  編輯 收藏 引用

            FeedBack:
            # re: Inside the C++ object model(二) 2008-05-23 13:00 編程的夜貓
            我又來了。好的。終于出二了。繼續(xù)支持博主  回復  更多評論
              
            # re: Inside the C++ object model(二) 2008-05-26 11:53 追夢時代
            學習了,希望LZ繼續(xù),期盼您的這個系列。這本書一直沒有時間買來看,讀了LZ的文章真是受益匪淺。  回復  更多評論
              
            精品国产乱码久久久久久浪潮| 久久人与动人物a级毛片| 国产精品久久久久久久| 国产精品久久久久久| 日本加勒比久久精品| 久久亚洲精品人成综合网| 国产精品综合久久第一页| 色妞色综合久久夜夜| 久久91精品国产91久久小草| 精品久久久久久久中文字幕| 色偷偷88888欧美精品久久久| 久久国产乱子伦精品免费强| 久久午夜夜伦鲁鲁片免费无码影视| 国产精品视频久久久| 国产精品久久久久久久久久影院| 精品久久久久久国产| 中文字幕热久久久久久久| 久久精品成人欧美大片| 久久婷婷五月综合97色一本一本| 久久亚洲精品国产亚洲老地址| 久久久久久综合一区中文字幕 | 亚洲精品无码成人片久久| 久久99国产亚洲高清观看首页| 思思久久99热只有频精品66| 久久99精品国产99久久6| 国产精品毛片久久久久久久| 无码国内精品久久人妻蜜桃| 思思久久99热只有频精品66| 亚洲精品乱码久久久久久不卡| 久久久久亚洲av成人无码电影 | 久久精品夜色噜噜亚洲A∨| 国产精品久久毛片完整版| 久久精品免费一区二区| 久久只有这里有精品4| 人妻精品久久久久中文字幕 | 久久人人爽人人爽人人av东京热| 久久精品无码一区二区日韩AV| 久久久久国产日韩精品网站| 国产精品免费久久久久久久久 | 久久这里只精品国产99热| 狠狠色婷婷综合天天久久丁香|