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

            Shuffy

            不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19
            [轉(zhuǎn)]http://m.shnenglu.com/tiandejian/archive/2007/05/20/ec_19.html

            第18條:     要像設(shè)計(jì)類型一樣設(shè)計(jì) class

            與其它的面向?qū)ο缶幊陶Z言類似,在 C++ 中,定義一個新的 class 便會引入一個新的類型的定義。一個 C++ 設(shè)計(jì)人員的大多數(shù)時間都會用在不斷豐富充實(shí)他們的類系統(tǒng)上。這意味著他不僅僅是一個 class 的設(shè)計(jì)者,而且是一個類型的設(shè)計(jì)者。重載函數(shù)和運(yùn)算符、控制內(nèi)存的分配和釋放、定義函數(shù)用于完成對象初始化和終止操作——這些都由設(shè)計(jì)人員全權(quán)包辦。我們知道語言設(shè)計(jì)人員在設(shè)計(jì)語言內(nèi)置的數(shù)據(jù)類型時傾注了大量心血,而一個類設(shè)計(jì)人員也要花費(fèi)差不多的精力。

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

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

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

            對象初始化與對象賦值有什么不同? 這個問題的答案決定著構(gòu)造函數(shù)與賦值運(yùn)算符之間的區(qū)別。不要混淆初始化和賦值的概念,這一點(diǎn)很重要,因?yàn)樗鼈兣c不同的函數(shù)調(diào)用相關(guān)。

            對于新類型的對象如何通過傳值方式傳遞? 請牢記,拷貝構(gòu)造函數(shù)定義了本類型如何通過傳值來傳遞對象。

            新類型對合法數(shù)值有哪些限制? 通常情況下,只有一些數(shù)值的集合來限定類的數(shù)據(jù)成員是否合法。這些集合決定了類中需要維護(hù)哪些恒量。而這些恒量又決定著數(shù)據(jù)成員中要進(jìn)行哪些錯誤檢查,尤其是構(gòu)造函數(shù)、賦值運(yùn)算符、以及“調(diào)節(jié)”函數(shù)。它們還會影響到函數(shù)會拋出什么樣的異常,同時,是否應(yīng)用這些集合,還會影響到函數(shù)異常的詳細(xì)內(nèi)容。

            新類型是否適用于繼承? 如果新類是由現(xiàn)成的類繼承而來的,那么就必須讓新類符合繼承的特征。尤其是要確定父類的成員函數(shù)是否應(yīng)為虛函數(shù)(參見第 34 和第 36 條)。如果期望讓其 它的類可以繼承本類 ,就需要考慮本類的成員函數(shù)是否應(yīng)為虛函數(shù),尤其是它的析構(gòu)函數(shù)(參見第 7 條)。

            新類型允許進(jìn)行哪些類型轉(zhuǎn)換? 新的類型存在于其它類型的海洋中,那么是否應(yīng)該提供新類型與其它類型的轉(zhuǎn)型功能呢?如果你期望為 T1 的一個對象提供途徑從而隱式將類型轉(zhuǎn)換為 T2 。可以 通過在 T1 類中放置一個類型轉(zhuǎn)換函數(shù)(比如 operator T2 ),或者在 T2 類中放置一個有單一參數(shù)的非 explicit 構(gòu) 造函數(shù)。如果你僅僅期望允許顯式類型轉(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ù)對新類型是有意義的? 這個問題的答案取決于你會為你的類生命哪些函數(shù)。一些函數(shù)將成為成員函數(shù),而一些則不會(參見第 23 24 46 條)。

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

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

            新類型中有哪些“尚未聲明的接口”? 新類型中提供了哪些性能、異常安全(參見第 29 條)、資源使用的保證(比如互斥鎖、動態(tài)內(nèi)存)?這些保證將會為類的實(shí)現(xiàn)提供更嚴(yán)格的約束。

            新類型有多通用? 可能你想做得并不是定義一個新類型。而是定義一新類型。如果真是這樣,你需要定義一個新的類模板

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

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

            牢記在心

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

            嫩草影院久久99| 久久精品国产亚洲AV无码偷窥| 久久亚洲国产午夜精品理论片| 亚洲国产精品久久久久久| 久久精品这里只有精99品| 久久久久亚洲AV无码专区首JN | 亚洲∧v久久久无码精品| 粉嫩小泬无遮挡久久久久久| 久久久久亚洲精品中文字幕 | 欧美777精品久久久久网| 日韩欧美亚洲国产精品字幕久久久| 久久亚洲2019中文字幕| 97久久国产亚洲精品超碰热| 热久久视久久精品18| 久久99精品综合国产首页| 亚洲午夜无码久久久久| 久久亚洲电影| 办公室久久精品| 久久精品国产亚洲av高清漫画 | 久久久久亚洲av无码专区| 久久久久噜噜噜亚洲熟女综合| 无码人妻久久一区二区三区免费 | 色诱久久久久综合网ywww| 久久电影网| 久久香蕉国产线看观看乱码| 99久久精品国产一区二区| 久久久久久国产精品免费免费| 91久久婷婷国产综合精品青草| 综合久久给合久久狠狠狠97色| 国产精品va久久久久久久| 久久er国产精品免费观看2| 久久亚洲中文字幕精品有坂深雪 | 一97日本道伊人久久综合影院| 91精品国产9l久久久久| 精品久久久久久无码专区| 久久偷看各类wc女厕嘘嘘| 日本人妻丰满熟妇久久久久久| 国产精品99久久久精品无码| 囯产极品美女高潮无套久久久| 合区精品久久久中文字幕一区| 久久亚洲色一区二区三区|