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

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

            第18條:     要像設計類型一樣設計 class

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

            能否設計出優秀的 class 對于設計人員來說是一項嚴峻的考驗,因為設計類型本身就是一項艱巨的任務。優秀的類型應該擁有自然的語法、直觀的語義,并且還要有一套或更多高效的實現。在 C++ 中,如果定義 class 的工作做得一團糟,那么期望達到上面的目標就是天方夜譚。甚至類的成員函數的聲明方式也會影響到它的性能。

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

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

            對象初始化與對象賦值有什么不同? 這個問題的答案決定著構造函數與賦值運算符之間的區別。不要混淆初始化和賦值的概念,這一點很重要,因為它們與不同的函數調用相關。

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

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

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

            新類型允許進行哪些類型轉換? 新的類型存在于其它類型的海洋中,那么是否應該提供新類型與其它類型的轉型功能呢?如果你期望為 T1 的一個對象提供途徑從而隱式將類型轉換為 T2 。可以 通過在 T1 類中放置一個類型轉換函數(比如 operator T2 ),或者在 T2 類中放置一個有單一參數的非 explicit 造函數。如果你僅僅期望允許顯式類型轉換,就需要編寫函數來執行這一轉換,但是這一函數不應是類型轉換運算符,也不應是 單一參數的非 explicit 造函數。(第 15 條中有隱式 / 顯式轉換函數的示例。)

            哪些運算符和函數對新類型是有意義的? 這個問題的答案取決于你會為你的類生命哪些函數。一些函數將成為成員函數,而一些則不會(參見第 23 、 24 、 46 條)。

            應明確拒絕哪些標準函數? 通過將它們聲明為 private 的可達到這一目的(參見第 6 條)。

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

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

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

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

            完整地回答以上的問題并不是一件簡單的事情,所以定義高效的類就是一項嚴峻的挑戰。然而,如果成功經受了這一挑戰,那么由用戶自定義的類產生的類型至少可以像內建數據類型一樣好用。一切都是值得的。

            牢記在心

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

            99久久国产热无码精品免费| 国产99久久精品一区二区| 久久AV高清无码| 国产亚洲精品美女久久久| 久久亚洲精品人成综合网| 久久被窝电影亚洲爽爽爽| 久久精品中文字幕一区| 久久久久久国产a免费观看黄色大片 | 伊人色综合九久久天天蜜桃| 综合久久一区二区三区| 色婷婷久久综合中文久久蜜桃av| 久久99精品久久久久久动态图| 国产99久久精品一区二区| 无码任你躁久久久久久| 91久久九九无码成人网站| 精品久久亚洲中文无码| 91久久精品国产成人久久| 97香蕉久久夜色精品国产| 久久国产精品波多野结衣AV| 一本色道久久HEZYO无码| 久久一区二区三区99| 色综合久久精品中文字幕首页 | 精品久久久久久无码人妻热| 香蕉久久久久久狠狠色| 国产精品青草久久久久福利99| 亚洲av伊人久久综合密臀性色| 欧美一区二区久久精品| 一级做a爰片久久毛片人呢| 久久精品毛片免费观看| 久久综合狠狠综合久久| 合区精品久久久中文字幕一区 | 久久精品天天中文字幕人妻| 一本色道久久88综合日韩精品| 国产AV影片久久久久久| 久久99久久99小草精品免视看| 无码AV波多野结衣久久| 久久婷婷五月综合国产尤物app| 蜜臀久久99精品久久久久久| 91久久精品国产免费直播| 亚洲国产精品久久久久| 亚洲国产精品一区二区久久|