• <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>
            posts - 9,  comments - 9,  trackbacks - 0

            Effective C++ study note

            From c to c plus plus

            1. const inline | #define
                a. 符號列表
                b. 類成員const static
                c. define 的缺陷
                d. ifdef控制編譯過程的作用

            2. iostream | studio.h   
                a. 辯證看待兩者:
                   isotream 缺陷:效率,標準化移植性,構(gòu)造函數(shù)對靜態(tài)對象初始化順序
                   stdio.h缺陷:類型安全,擴展性
                b. iostream & iostream.h

            3. new delete | malloc free
                a. constructor destructor
                b. match

            4. use c++ comment style
                a. c++ style用于行注釋以及嵌套注釋相當有優(yōu)勢
                b. 老的編譯器對預處理的時候不認識c++style注釋

            Memory management

            5. match new delete
                a. new delete [] 如果不匹配意味著什么,這個是如何實現(xiàn)的?
                b. 杜絕數(shù)組的typedef

            6. call delete in destructor
                a. 所有的指針成員都必須釋放

            7. 準備好內(nèi)存不足的情況
                a. set_new_handler

            8. operator new & operator delete 常規(guī)
                a. 如何重載類的new delete,需要考慮什么樣的情況

            9. 避免隱藏標準形式的new
                a. 如何全面支持標準new地操作,必須保持一致的調(diào)用方式。
                b. 注意new, delete調(diào)用時候是如何傳參數(shù)的

            10. 同時提供new,delete
                a. 需要傳遞這個大小的值嗎?如何傳遞?尤其是繼承的時候

            Constructor destructor operator=
            11. 適時提供拷貝構(gòu)造以及賦值操作
                a. 深拷貝,淺拷貝,逐位拷貝,成員拷貝
                b. 類里有指針成員時候提供自己版本拷貝構(gòu)造,賦值操作,選擇(禁用,內(nèi)存拷貝,引用計數(shù))

            12. 初始化列表與構(gòu)造函數(shù)
                a. 必須置于初始化列表的情況
                b. 兩者的含義。(構(gòu)造函數(shù)初始化,以及賦值操作)
                c. 效率

            13. 初始化列表中成員順序和它們在類中申明的順序
                a. 類成員是按照它們在類里被聲明的順序初始化的,如果多繼承,按照基類生命順序初始化。與初始化列表無關。

            14. 基類有虛析構(gòu)函數(shù)
                a. 為什么行為無法預知?
                b. 如何使用內(nèi)聯(lián)函數(shù)包裝虛析構(gòu)函數(shù)?

            15. 讓operator=返回*this地引用
                a. 為什么必須返回左值?
                b. 臨時對象的const屬性

            16. 在operator=中對所有數(shù)據(jù)成員賦值
                a. 這里的所有成員包括:己類的成員, 所有基類成員。
                b. 如何處理基類的成員?
                c. 多繼承下拷貝構(gòu)造函數(shù)也有這樣的問題。

            17. 在operator=中檢查給自己賦值的情況
                a. 檢查的重要性:提高效率,保證正確性
                b. 如何檢查 (值判斷,地址判斷,對象標識)
                c. 擴展,只要別名有可能出現(xiàn)的函數(shù)都需要注意這個問題

            類與函數(shù)
            18. 爭取類的接口完整并且最小
               
            19. 分清楚成員函數(shù),非成員函數(shù)和友元函數(shù)
                a. 成員函數(shù)與非成員函數(shù)比較:雖然兩者可以對所有參數(shù)隱式轉(zhuǎn)換的。但是成員函數(shù)的this參數(shù)是不放在可轉(zhuǎn)換列表里面的。
                b. 友元函數(shù)雖然也是屬于非成員函數(shù),但是它的不同就是能夠訪問私有變量。
                c. 設計一個函數(shù)的時候考慮順序:成員函數(shù)->非成員函數(shù)->友元函數(shù):只有非成員函數(shù)對最左面的參數(shù)進行類型轉(zhuǎn)換,如果f需要對最左面的參數(shù)轉(zhuǎn)換,讓f成為非成員函數(shù)。如果f還需要訪問類的非公有成員,讓f成為類的友元函數(shù)。其他情況下都申明為成員函數(shù)。

            20. 避免public接口出現(xiàn)數(shù)據(jù)成員
                a. 基于幾方面的考慮(一致性,功能分離)

            21. 盡可能使用const
                a. 星號作為分隔符
                b. bitwise constness & conceptual constness
                c. mutable or const_cast

            22. 盡量用傳引用而不是傳值
                a. slicing-problem while pass value

            23. 必須返回一個對象時不要試圖返回一個引用
                a. for example: operator *

            24. 在函數(shù)重載和設定參數(shù)缺省值間慎重選擇
               
            25. 避免對指針和數(shù)字類型重載

            26. 潛在的二義性
                a. 二義性來源:方法二義性,函數(shù)重載參數(shù)二義性,繼承帶來的二義性
                b. C++語言的標準轉(zhuǎn)換??
                c. 對類成員的引用所產(chǎn)生的二義性不考慮訪問權(quán)限-〉改變一個類成員的訪問權(quán)限不應該改變程序的含義

            27. 如果不想使用隱式生成的函數(shù)就要顯式地禁止它
                a. private申明它但是不去實現(xiàn),這樣鏈接器會幫你檢查錯誤

            28. 劃分全局名字空間

            類和函數(shù):實現(xiàn)

            29. 避免返回內(nèi)部數(shù)據(jù)的句柄
                a. 指針,引用的返回。注意const版本

            30. 避免這樣的成員函數(shù):返回值是指向成員非const指針或引用,但成員的訪問級比這個函數(shù)要低

            31. 不要返回局部對象的引用

            32. 盡可能的推遲變量定義
                a. 不必要的函數(shù)調(diào)用開銷

            33. 明智的使用內(nèi)聯(lián)
                a. 內(nèi)聯(lián)的好處
                b. 被外聯(lián)的內(nèi)聯(lián)函數(shù)的編譯器處理上:首先都要承擔函數(shù)調(diào)用的代價,其次舊的編譯器還可能作為static函數(shù)處理來函數(shù)的鏈接的二義性
                c. 慎重選擇內(nèi)聯(lián),重視編譯器的警告
                d. 內(nèi)聯(lián)的關鍵字是針對實現(xiàn)定義部分的,不是針對聲明的
                e. 取內(nèi)聯(lián)函數(shù)的地址會導致編譯器為此生成一個函數(shù)體,認為破壞內(nèi)聯(lián)定義
                f. 類成員函數(shù)聲明時候同時定義函數(shù)體,默認成內(nèi)聯(lián)
                g. 在新的編譯器上面,內(nèi)聯(lián)是一個不穩(wěn)定的屬性,至于在代碼里的是否展開不能定論這個函數(shù)是否內(nèi)聯(lián)
                h. 在編譯器看來多態(tài)始終比內(nèi)聯(lián)重要。在編譯期間,靜態(tài)調(diào)用是可以展開的,動態(tài)的不可以
                i. 內(nèi)聯(lián)是否展開除了要看本身代碼的復雜度外還有其他因素影響:編譯器的內(nèi)聯(lián)開關,調(diào)用方式
                j. 在新的編譯器看來不管內(nèi)聯(lián)的是否展開或是否外聯(lián),亦或是否綜合使用,記住,代碼實體只有一份
                k. 虛函數(shù)與內(nèi)聯(lián)的結(jié)合是一個很特殊的例子。

            34. 降低文件間的編譯依賴性
                a. 前向聲明 & 句柄類 & 協(xié)議類

            繼承和面向?qū)ο笤O計

            C++提供了多種很令人困惑的面向?qū)ο髽?gòu)造部件,包括公有、保護和私有基類;虛擬和非虛擬基類;虛擬和非虛擬成員函數(shù)。這些部件不僅互相之間有聯(lián)系,還和C++的其它部分相互作用。所以,對于每種部件的含義、什么時候該用它們、怎樣最好地和C++中非面向?qū)ο蟛糠窒嘟Y(jié)合?

            經(jīng)典問題:
                a. 假如需要設計一組具有共同特征的類,是該使用繼承使得所有的類都派生于一個共同的基類呢,還是使用模板使得它們都從一個共同的代碼框架中產(chǎn)生?
                b. 類A 的實現(xiàn)要用到類B,是讓A 擁有一個類型為B 的數(shù)據(jù)成員呢,還是讓A 私有繼承于B?
                c. 假設想設計一個標準庫中沒有提供的、類型安全的同族容器類(條款49列出了標準庫實際提供的容器類),是使用模板呢,還是最好為某個 "自身用普通(void*)指針來實現(xiàn)" 的類建立類型安全的接口?

            35. 公有繼承體現(xiàn)‘是一個’的含義

            36. 區(qū)分接口繼承和實現(xiàn)繼承
                a. 純虛函數(shù)的目的在于:使派生類僅僅是繼承函數(shù)的接口
                b. 簡單虛函數(shù)的目的在于:使派生類繼承函數(shù)的接口和缺省實現(xiàn)
                c. 非虛函數(shù)的目的在于:使派生類繼承函數(shù)的接口和強制實現(xiàn)

            37. 決不要重新定義繼承而來得非虛函數(shù)
                a. 非虛函數(shù)是靜態(tài)綁定,虛函數(shù)是動態(tài)綁定

            38. 決不要重新定義繼承而來的缺省參數(shù)值
                a. 缺省參數(shù)值也是靜態(tài)綁定的

            39. 避免‘向下轉(zhuǎn)換’繼承層次
                a. 向下意味著向派生類轉(zhuǎn)換
                b. 如何消除向下轉(zhuǎn)換:虛函數(shù);加強類型約束;dynamic_cast

            40. 通過分層來體現(xiàn)‘有一個’或‘用……來實現(xiàn)’

            41. 區(qū)分繼承和模板
                a. 兩者的區(qū)別在于類型T是否影響類的行為

            42. 明智的使用私有繼承
                a. 私有繼承常用語實現(xiàn)而非設計
                b. 實例化模板導致代碼膨脹
                c. 示例代碼設計:

             1 template<class T>
             2 class Stack: private GenericStack {
             3 public:
             4  void push(T *objectPtr) { GenericStack::push(objectPtr); }
             5  T * pop() return static_cast<T*>(GenericStack::pop()); }
             6  bool empty() const return GenericStack::empty(); }
             7 }

             8
             9 class GenericStack {
            10 protected:
            11  GenericStack();
            12  ~GenericStack();
            13  void push(void *object);
            14  void * pop();
            15  bool empty() const;
            16 private:
            17  // 同上
            18 }

            19

             

            43. 明智的使用多繼承
                a. adapter 是一個很好的多繼承的例子
                b. 虛繼承的實現(xiàn)以及構(gòu)造特性

            44. 說你想說的,理解你說想說的
                a. 整盤的設計考慮
                b. 共同的基類意味著共同的特性; 公有繼承意味著是一個, 私有繼承意味著用什么來實現(xiàn), 分層意味著有一個或者用……來實現(xiàn)
                c. 對于公有繼承而言:純虛函數(shù)意味著繼承接口,簡單虛函數(shù)意味著繼承函數(shù)的接口加上一個缺省實現(xiàn),非虛函數(shù)意味著繼承數(shù)的接口加上一個強制實現(xiàn)(特殊性上的不變性)

            雜項

            45. 弄清楚C++在幕后為你所作的
                a. 缺省類成員函數(shù):構(gòu)造,拷貝構(gòu)造,析構(gòu)(虛待定),賦值,取址(2個)
                b. 注意:如果需要這些函數(shù)才會被生成
                c. 賦值操作必須驗證合法才能通過編譯器

            46. 寧可編譯和鏈接時出錯,也不要運行時出錯

            47. 確保非局部靜態(tài)對象在使用前被初始化
                a. 初始化的順序不確定導致很難捕捉這個靜態(tài)對象初始化的順序
                b. 解決辦法:singleton

            48. 重視編譯器警告

            49. 重視標準庫

            posted on 2007-04-10 12:23 MicroYang 閱讀(343) 評論(0)  編輯 收藏 引用
            <2007年4月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(1)

            隨筆檔案

            Friend

            • Catherine
            • 深海羚羊
            • 似雨打芭蕉,似風吹梧桐葉,帶著一絲冰冷,也帶著一絲清新------冰柔語絲

            搜索

            •  

            最新評論

            • 1.?re: 本立道生[未登錄]
            • 極端情況下,容器的size很大,inline帶來的performance的提高不可忽視。但是問題問的是仿函數(shù)普遍的優(yōu)點。能保存數(shù)據(jù)才是標準answer
            • --zxx
            • 2.?re: 本立道生
            • 理解有誤。函數(shù)對象可實現(xiàn)函數(shù)指針不能實現(xiàn)的功能才是主要的。
            • --佚名
            • 3.?re: 打算學習算法
            • 汗顏的很,細節(jié)的地方實在是沒有注意。應該是全排列才對。實在抱歉的很!
            • --MicroYang
            • 4.?re: 打算學習算法
            • permutation
            • --Rome
            • 5.?re: 打算學習算法[未登錄]
            • 呵呵,樓主在注釋里面寫得很清楚啊
              "*Description: It uses recursive to enumerate all cases. ”
            • --Sandy

            閱讀排行榜

            評論排行榜

            国产精品99久久久久久宅男小说| 精品久久久无码21p发布| 亚洲AV无码成人网站久久精品大| av色综合久久天堂av色综合在| 久久久久亚洲AV片无码下载蜜桃| 人妻精品久久久久中文字幕一冢本 | 亚洲精品无码久久久| 久久香蕉超碰97国产精品| 久久国产精品免费| 亚洲精品tv久久久久久久久| 青青草原综合久久| 精产国品久久一二三产区区别 | 麻豆一区二区99久久久久| 丁香五月综合久久激情| 亚洲精品tv久久久久久久久| 国产精品99久久久久久www| 午夜精品久久久久久久久| 久久无码精品一区二区三区| 国产综合久久久久久鬼色| 99久久夜色精品国产网站| 久久久久亚洲av成人无码电影| 国产精品18久久久久久vr| 久久天天躁夜夜躁狠狠| 久久久国产精华液| 99久久精品国产一区二区| 久久久久亚洲AV无码网站| 久久精品国产免费观看| 久久伊人影视| 欧美精品丝袜久久久中文字幕| 久久午夜电影网| 99久久精品费精品国产| 久久亚洲高清观看| 久久99精品国产99久久| 久久精品99久久香蕉国产色戒 | 人妻系列无码专区久久五月天| 97精品国产97久久久久久免费| 久久精品国产久精国产思思| 久久午夜伦鲁片免费无码| 少妇精品久久久一区二区三区| 亚洲国产欧美国产综合久久| 亚洲欧美日韩中文久久|