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

            洛譯小筑

            別來無恙,我的老友…
            隨筆 - 45, 文章 - 0, 評(píng)論 - 172, 引用 - 0
            數(shù)據(jù)加載中……

            [ECPP讀書筆記 條目19] 要像設(shè)計(jì)類型一樣設(shè)計(jì)class

            與其它的面向?qū)ο缶幊陶Z言類似,在C++中,定義一個(gè)新的class即定義了一個(gè)新的類型。一個(gè)C++開發(fā)者的職業(yè)生涯的大多數(shù)時(shí)間都將用在“不斷豐富充實(shí)他們的類型系統(tǒng)”上。這意味著他不僅僅是一個(gè)class的設(shè)計(jì)者,更是一個(gè)類型的設(shè)計(jì)者。函數(shù)和運(yùn)算符重載、內(nèi)存的分配和釋放控制、對(duì)象初始化和終止定義——一切都由設(shè)計(jì)人員手工完成。我們知道,語言設(shè)計(jì)人員在設(shè)計(jì)內(nèi)建數(shù)據(jù)類型時(shí)傾注了大量心血,而一個(gè)class設(shè)計(jì)人員也要花費(fèi)同樣的精力。

            能否設(shè)計(jì)出優(yōu)秀的class對(duì)于設(shè)計(jì)人員來說是一項(xiàng)嚴(yán)峻的考驗(yàn),因?yàn)樵O(shè)計(jì)出好的數(shù)據(jù)類型本身就是一項(xiàng)艱巨的任務(wù)。優(yōu)秀的類型擁有自然的語法、直觀的語義,并且還有一套或多套高效的實(shí)現(xiàn)。在C++中,如果定義class的工作做得一團(tuán)糟,那么期望達(dá)到上面的目標(biāo)就是天方夜譚。甚至class的成員函數(shù)的聲明方式也會(huì)影響到它的性能。

            那么,如何把class設(shè)計(jì)得更高效呢?首先,你必須要了解你所面對(duì)的問題。幾乎所有的class設(shè)計(jì)都將面對(duì)下面的問題,它們的答案可以對(duì)設(shè)計(jì)起到一定的約束作用:

            新類型的對(duì)象應(yīng)如何創(chuàng)建和刪除?class中與之相關(guān)的函數(shù)包括:構(gòu)造函數(shù)和析構(gòu)函數(shù),以及class中其它的內(nèi)存分配和釋放函數(shù)(operator newoperator new[]、operator delete、operator delete[],參見第八章)。如果你自己手動(dòng)編寫它們,這個(gè)問題的解決方式將會(huì)影響到這些函數(shù)。

            對(duì)象初始化與對(duì)象賦值有怎樣的不同?這個(gè)問題的答案決定著構(gòu)造函數(shù)與賦值運(yùn)算符之間的區(qū)別。不要混淆初始化和賦值的概念,這一點(diǎn)很重要,因?yàn)槎咚鎸?duì)的函數(shù)調(diào)用類型是不同的。

            新類型在通過傳值方式傳遞對(duì)象時(shí)意味著什么?請(qǐng)牢記,一個(gè)類型是通過拷貝構(gòu)造函數(shù)來定義傳值操作的實(shí)現(xiàn)方式的。

            新類型對(duì)合法數(shù)值有哪些限制?通常情況下,對(duì)于某個(gè)class的數(shù)據(jù)成員而言,只有一些特定的數(shù)值組合是合法的。這些組合決定了class應(yīng)遵循哪些定律。而這些定律又決定了在數(shù)據(jù)成員中你應(yīng)該進(jìn)行哪些錯(cuò)誤檢查,尤其是構(gòu)造函數(shù)、賦值運(yùn)算符、以及“設(shè)定”函數(shù)(即setter)。它們還會(huì)影響到函數(shù)會(huì)拋出什么樣的異常,同時(shí)在某些情況下還有可能影響到函數(shù)所拋出異常的細(xì)節(jié)。

            新類型是否適用于繼承?如果新的class由現(xiàn)有的class繼承而來,那么新的class應(yīng)遵循現(xiàn)有class(即父類)設(shè)計(jì)方案的限制。尤其是要確定父類的成員函數(shù)是否為虛函數(shù)(參見條目34和36)。如果期望讓其它的class可以繼承當(dāng)前的class,就需要考慮當(dāng)前class的成員函數(shù)是否應(yīng)為虛函數(shù),尤其是它的析構(gòu)函數(shù)(參見條目7)。

            新類型允許進(jìn)行哪些類型轉(zhuǎn)換?新的類型存在于各式各樣的類型之間,那么是否應(yīng)該提供新類型與其它類型的類型轉(zhuǎn)換功能呢?如果你期望讓T1的一個(gè)對(duì)象將類型隱式轉(zhuǎn)換為T2。可以通過在T1類中放置一個(gè)類型轉(zhuǎn)換函數(shù)(比如operator T2),或者在T2類中放置一個(gè)有單一參數(shù)的非explicit構(gòu)造函數(shù)。如果你期望T1僅允許顯式類型轉(zhuǎn)換,就需要編寫函數(shù)來執(zhí)行這一轉(zhuǎn)換,但是這一函數(shù)不應(yīng)是類型轉(zhuǎn)換運(yùn)算符,也不應(yīng)是單一參數(shù)的非explicit構(gòu)造函數(shù)。(條目15中有隱式/顯式轉(zhuǎn)換函數(shù)的示例。)

            哪些運(yùn)算符和函數(shù)對(duì)新類型是有意義的?這個(gè)問題的答案取決于你會(huì)為你的class聲明哪些函數(shù)。一些函數(shù)將成為成員函數(shù),另一些則不是(參見條目23、24、46)。

            應(yīng)明確拒絕哪些標(biāo)準(zhǔn)函數(shù)?通過將它們聲明為private的可達(dá)到這一目的(參見條目6)。

            誰可以訪問新類型中的數(shù)據(jù)成員?這一問題可以幫助我們確定哪些成員應(yīng)為public的,哪些是protected的,以及哪些是private的。同時(shí),也可以幫助我們確定哪些class和/或函數(shù)應(yīng)該是友元,還有嵌套的class是否有意義。

            新類型中有哪些“未聲明的接口”?如果你充分考慮了新類型中性能、異常安全(參見條目29)、資源使用(比如互斥鎖、動(dòng)態(tài)內(nèi)存)等問題,系統(tǒng)將許諾給你什么呢?我們說你在這些領(lǐng)域所作出的努力,將確保你的class的實(shí)現(xiàn)中相應(yīng)的約束條件能夠得以嚴(yán)格實(shí)施。

            新類型有多通用?可能你想做的并不僅僅是定義一個(gè)新類型。而是定義一族新類型。如果真是這樣,需要你定義的就不是一個(gè)新的class了,你需要定義一個(gè)新的類模板(class template)。

            你真的需要一個(gè)新類型嗎?如果你創(chuàng)建新的派生類僅僅為了為現(xiàn)有的類添加新的功能,那么通過簡(jiǎn)單地定義一個(gè)或多個(gè)非成員函數(shù)或者模板可能會(huì)更好的達(dá)到目標(biāo)。

            完整地回答以上的問題列表并不是一件簡(jiǎn)單的事情,因此定義高效的class就是一項(xiàng)嚴(yán)峻的挑戰(zhàn)。然而,如果成功完成了這一挑戰(zhàn),那么由用戶自定義的class生成的類型至少可以像內(nèi)建數(shù)據(jù)類型一樣好用。一切都是值得的。

            時(shí)刻牢記

            class設(shè)計(jì)就是類型的設(shè)計(jì)。在定義一個(gè)新的類型之前,要確保將本條目討論的所有問題考慮周全。

            posted on 2007-05-20 23:30 ★ROY★ 閱讀(917) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Effective C++

            評(píng)論

            # re: 【翻譯】[Effective C++第三版?中文版][第19條]要像設(shè)計(jì)類型一樣設(shè)計(jì)class  回復(fù)  更多評(píng)論   

            好久不見更新了。。。
            2007-05-30 14:27 | sniffer

            # re: 【翻譯】[Effective C++第三版?中文版][第19條]要像設(shè)計(jì)類型一樣設(shè)計(jì)class  回復(fù)  更多評(píng)論   

            @sniffer
            這幾個(gè)原因:
            1、有個(gè)哥們結(jié)婚去赴宴了,在他家住了兩天;
            2、要考試了,去駕校學(xué)車時(shí)間有點(diǎn)兒緊;
            3、這幾天老犯困,狀態(tài)不好
            4、自個(gè)兒懶(其實(shí)這條才是最重要的:)。

            我才發(fā)現(xiàn)自己已經(jīng)退化成了一個(gè)無法用筆來記錄自己感受的人。有時(shí)候走在街上,躺在床上,腦袋里有千頭萬緒都能寫成一本書,但拿起筆來總是欲哭無淚。還好有歌聲陪伴,翻出若干年前聽的老歌,仿佛才能回到那個(gè)時(shí)代,回憶起那時(shí)候的事情來,或是幸福、或是苦澀、也可能是平淡無奇。
            2007-06-01 18:19 | ★ROY★
            97久久精品无码一区二区天美| 久久婷婷五月综合97色直播| A级毛片无码久久精品免费| 亚洲αv久久久噜噜噜噜噜| 国产精品一久久香蕉国产线看观看| 2020久久精品亚洲热综合一本| 亚洲中文字幕伊人久久无码| 久久99久久99精品免视看动漫| 久久天天躁狠狠躁夜夜96流白浆| 久久久久亚洲精品中文字幕| 久久这里只有精品18| 精品综合久久久久久98| 久久发布国产伦子伦精品| 久久久久久综合网天天| 69久久精品无码一区二区| 亚洲国产精品久久久久婷婷软件| 久久人人爽人人爽人人片AV不| 精品久久亚洲中文无码| 91精品国产91久久久久久蜜臀| 亚洲国产精品综合久久网络| 久久精品aⅴ无码中文字字幕不卡| 日韩亚洲国产综合久久久| 亚洲国产精品高清久久久| 精品久久777| 亚洲日本va中文字幕久久| 婷婷久久综合九色综合98| 一本色道久久88综合日韩精品 | 久久66热人妻偷产精品9| 国产精品99久久久久久www| 久久久久久久久久久| 国产精品成人精品久久久| 无码专区久久综合久中文字幕| 国产激情久久久久影院| 精品综合久久久久久888蜜芽| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲中文字幕无码久久精品1 | 久久久久亚洲Av无码专| 日批日出水久久亚洲精品tv| 人人狠狠综合久久88成人| 综合久久精品色| 久久久久婷婷|