青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402530
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

第11章 其它編程經驗
11.1 使用const提高函數的健壯性
看到const關鍵字,C++程序員首先想到的可能是const常量。這可不是良好的條件反射。如果只知道用const定義常量,那么相當于把火藥僅用于制作鞭炮。const更大的魅力是它可以修飾函數的參數、返回值,甚至函數的定義體。
const是constant的縮寫,“恒定不變”的意思。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。所以很多C++程序設計書籍建議:“Use const whenever you need”。

11.1.1 用const修飾函數的參數
如果參數作輸出用,不論它是什么數據類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加const修飾,否則該參數將失去輸出功能。
const只能修飾輸入參數:
?    如果輸入參數采用“指針傳遞”,那么加const修飾可以防止意外地改動該指針,起到保護作用。
例如StringCopy函數:
        void StringCopy(char *strDestination, const char *strSource);
其中strSource是輸入參數,strDestination是輸出參數。給strSource加上const修飾后,如果函數體內的語句試圖改動strSource的內容,編譯器將指出錯誤。

?    如果輸入參數采用“值傳遞”,由于函數將自動產生臨時變量用于復制該參數,該輸入參數本來就無需保護,所以不要加const修飾。
例如不要將函數void Func1(int x) 寫成void Func1(const int x)。同理不要將函數void Func2(A a) 寫成void Func2(const A a)。其中A為用戶自定義的數據類型。

?    對于非內部數據類型的參數而言,象void Func(A a) 這樣聲明的函數注定效率比較底。因為函數體內將產生A類型的臨時對象用于復制參數a,而臨時對象的構造、復制、析構過程都將消耗時間。
為了提高效率,可以將函數聲明改為void Func(A &a),因為“引用傳遞”僅借用一下參數的別名而已,不需要產生臨時對象。但是函數void Func(A &a) 存在一個缺點:“引用傳遞”有可能改變參數a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函數最終成為void Func(const A &a)。
以此類推,是否應將void Func(int x) 改寫為void Func(const int &x),以便提高效率?完全沒有必要,因為內部數據類型的參數不存在構造、析構的過程,而復制也非常快,“值傳遞”和“引用傳遞”的效率幾乎相當。
    問題是如此的纏綿,我只好將“const &”修飾輸入參數的用法總結一下,如表11-1-1所示。

對于非內部數據類型的輸入參數,應該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

對于內部數據類型的輸入參數,不要將“值傳遞”的方式改為“const引用傳遞”。否則既達不到提高效率的目的,又降低了函數的可理解性。例如void Func(int x) 不應該改為void Func(const int &x)。

表11-1-1 “const &”修飾輸入參數的規則

11.1.2 用const修飾函數的返回值
?    如果給以“指針傳遞”方式的函數返回值加const修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指針。
例如函數
        const char * GetString(void);
如下語句將出現編譯錯誤:
        char *str = GetString();
正確的用法是
        const char *str = GetString();

?    如果函數返回值采用“值傳遞方式”,由于函數會把返回值復制到外部臨時的存儲單元中,加const修飾沒有任何價值。
    例如不要把函數int GetInt(void) 寫成const int GetInt(void)。
    同理不要把函數A GetA(void) 寫成const A GetA(void),其中A為用戶自定義的數據類型。
    如果返回值不是內部數據類型,將函數A GetA(void) 改寫為const A & GetA(void)的確能提高效率。但此時千萬千萬要小心,一定要搞清楚函數究竟是想返回一個對象的“拷貝”還是僅返回“別名”就可以了,否則程序會出錯。見6.2節“返回值的規則”。

?    函數返回值采用“引用傳遞”的場合并不多,這種方式一般只出現在類的賦值函數中,目的是為了實現鏈式表達。
例如
    class A
    {…
        A & operate = (const A &other);    // 賦值函數
    };
    A a, b, c;         // a, b, c 為A的對象
    …
    a = b = c;            // 正常的鏈式賦值
    (a = b) = c;        // 不正常的鏈式賦值,但合法
如果將賦值函數的返回值加const修飾,那么該返回值的內容不允許被改動。上例中,語句 a = b = c仍然正確,但是語句 (a = b) = c 則是非法的。

11.1.3 const成員函數
    任何不會修改數據成員的函數都應該聲明為const類型。如果在編寫const成員函數時,不慎修改了數據成員,或者調用了其它非const成員函數,編譯器將指出錯誤,這無疑會提高程序的健壯性。
以下程序中,類stack的成員函數GetCount僅用于計數,從邏輯上講GetCount應當為const函數。編譯器將指出GetCount函數中的錯誤。
    class Stack
{
      public:
        void     Push(int elem);
        int     Pop(void);
        int        GetCount(void)  const;    // const成員函數
      private:
        int        m_num;
        int        m_data[100];
};

    int Stack::GetCount(void)  const
{
        ++ m_num;    // 編譯錯誤,企圖修改數據成員m_num
    Pop();        // 編譯錯誤,企圖調用非const函數
    return m_num;
    }
    const成員函數的聲明看起來怪怪的:const關鍵字只能放在函數聲明的尾部,大概是因為其它地方都已經被占用了。
11.2 提高程序的效率
程序的時間效率是指運行速度,空間效率是指程序占用內存或者外存的狀況。
全局效率是指站在整個系統的角度上考慮的效率,局部效率是指站在模塊或函數角度上考慮的效率。

?    【規則11-2-1】不要一味地追求程序的效率,應當在滿足正確性、可靠性、健壯性、可讀性等質量因素的前提下,設法提高程序的效率。

?    【規則11-2-2】以提高程序的全局效率為主,提高局部效率為輔。

?    【規則11-2-3】在優化程序的效率時,應當先找出限制效率的“瓶頸”,不要在無關緊要之處優化。

?    【規則11-2-4】先優化數據結構和算法,再優化執行代碼。

?    【規則11-2-5】有時候時間效率和空間效率可能對立,此時應當分析那個更重要,作出適當的折衷。例如多花費一些內存來提高性能。

?    【規則11-2-6】不要追求緊湊的代碼,因為緊湊的代碼并不能產生高效的機器碼。

11.3 一些有益的建議
?    【建議11-3-1】當心那些視覺上不易分辨的操作符發生書寫錯誤。
我們經常會把“==”誤寫成“=”,象“||”、“&&”、“<=”、“>=”這類符號也很容易發生“丟1”失誤。然而編譯器卻不一定能自動指出這類錯誤。

?    【建議11-3-2】變量(指針、數組)被創建之后應當及時把它們初始化,以防止把未被初始化的變量當成右值使用。

?    【建議11-3-3】當心變量的初值、缺省值錯誤,或者精度不夠。

?    【建議11-3-4】當心數據類型轉換發生錯誤。盡量使用顯式的數據類型轉換(讓人們知道發生了什么事),避免讓編譯器輕悄悄地進行隱式的數據類型轉換。

?    【建議11-3-5】當心變量發生上溢或下溢,數組的下標越界。

?    【建議11-3-6】當心忘記編寫錯誤處理程序,當心錯誤處理程序本身有誤。

?    【建議11-3-7】當心文件I/O有錯誤。

?    【建議11-3-8】避免編寫技巧性很高代碼。

?    【建議11-3-9】不要設計面面俱到、非常靈活的數據結構。

?    【建議11-3-10】如果原有的代碼質量比較好,盡量復用它。但是不要修補很差勁的代碼,應當重新編寫。

?    【建議11-3-11】盡量使用標準庫函數,不要“發明”已經存在的庫函數。

?    【建議11-3-12】盡量不要使用與具體硬件或軟件環境關系密切的變量。

?    【建議11-3-13】把編譯器的選擇項設置為最嚴格狀態。

?    【建議11-3-14】如果可能的話,使用PC-Lint、LogiScope等工具進行代碼審查。




posted on 2007-12-17 16:46 sdfasdf 閱讀(601) 評論(2)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: 高質量C++/C 編程指南第十一章(林銳博士經典,與大家共同學習) 2007-12-18 14:59 夢馨
辛苦了  回復  更多評論
  

# re: 高質量C++/C 編程指南第十一章(林銳博士經典,與大家共同學習) 2007-12-19 13:42 koson
這書不錯,不過我更喜歡effective c++ ,呵呵。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品高潮在线| 久久综合九九| 国产一区二区按摩在线观看| 亚洲欧洲日韩综合二区| 校园激情久久| 亚洲欧美精品一区| 欧美亚洲免费| 久久亚洲影院| 免费一级欧美片在线观看| 另类激情亚洲| 亚洲激情电影在线| 中文一区二区| 久久精品99国产精品| 久久婷婷成人综合色| 免费欧美视频| 国产精品豆花视频| 韩国欧美一区| 日韩视频中文| 亚洲综合色网站| 久久激情视频免费观看| 欧美成人午夜激情在线| 亚洲乱码久久| 久久er精品视频| 欧美日本三级| 韩国成人精品a∨在线观看| 亚洲毛片在线观看.| 欧美一区二区三区精品| 欧美激情按摩| 欧美中文字幕不卡| 欧美四级在线观看| 亚洲国产网站| 欧美在线免费观看| 亚洲国产成人高清精品| 午夜精品一区二区三区在线| 欧美激情综合在线| 国语精品一区| 亚洲一区免费网站| 亚洲国产成人av好男人在线观看| 亚洲欧美日韩中文视频| 欧美精品99| 亚洲国产日韩欧美在线图片 | 亚洲精品乱码视频| 亚洲欧美精品伊人久久| 免费在线亚洲欧美| 亚洲一区二区综合| 欧美日韩视频专区在线播放| 狠狠狠色丁香婷婷综合激情| 午夜在线成人av| 亚洲国产欧美一区二区三区久久| 午夜精品福利在线| 国产精品久久久久久久久久免费 | 亚洲午夜精品一区二区| 毛片一区二区三区| 国内视频一区| 久久黄色网页| 蜜桃av一区二区三区| 国产精品第一区| 国产精品成人播放| 亚洲视频精选| 最新国产乱人伦偷精品免费网站 | 久久色在线观看| 国产日韩欧美综合| 国产精品久久久久9999高清| 国产自产在线视频一区| 亚洲主播在线播放| 日韩亚洲成人av在线| 欧美成人黑人xx视频免费观看| 亚洲国产精品毛片| 欧美国产先锋| 欧美国产日产韩国视频| 91久久国产精品91久久性色| 亚洲国产精品日韩| 欧美日本三区| 亚洲欧美日韩专区| 亚洲女女做受ⅹxx高潮| 国产美女精品免费电影| 久久深夜福利免费观看| 免费观看在线综合| 一区二区三区日韩在线观看| 亚洲一区二区三| 国产一区二区三区高清播放| 可以看av的网站久久看| 麻豆精品视频| 一区二区电影免费在线观看| 亚洲私拍自拍| 精品91在线| 亚洲国产三级在线| 国产精品欧美久久| 久久久久免费观看| 欧美激情在线播放| 久久久www成人免费毛片麻豆| 美女福利精品视频| 亚洲永久免费观看| 久久亚洲不卡| 午夜精品成人在线| 免播放器亚洲一区| 亚洲欧美国产高清va在线播| 久久久久久久久久看片| 亚洲午夜av在线| 久久久久这里只有精品| 亚洲免费视频成人| 欧美成人日韩| 久久精品在线| 欧美性开放视频| 欧美成人国产va精品日本一级| 欧美色大人视频| 欧美成人午夜免费视在线看片| 国产精品va在线播放| 欧美护士18xxxxhd| 国产亚洲成精品久久| 一区二区三区高清视频在线观看| 经典三级久久| 蜜臀91精品一区二区三区| 久久亚洲影院| 国产午夜久久| 欧美一级夜夜爽| 亚洲欧美激情四射在线日 | 欧美a级在线| 久久久久久久久蜜桃| 中文久久精品| 蜜臀av性久久久久蜜臀aⅴ| 午夜亚洲性色福利视频| 欧美国产免费| 欧美国产91| 一色屋精品视频免费看| 亚洲男同1069视频| 亚洲女人天堂av| 欧美女主播在线| 欧美成人精品高清在线播放| 国产永久精品大片wwwapp| 亚洲综合久久久久| 性18欧美另类| 国产精品午夜国产小视频| 在线一区亚洲| 亚洲欧美日韩国产成人| 欧美三区在线视频| 夜夜狂射影院欧美极品| 亚洲午夜日本在线观看| 欧美午夜精品久久久久久久| 99精品国产热久久91蜜凸| 中文有码久久| 国产精品久久久亚洲一区| 亚洲一区二区三区四区五区黄| 亚洲一区二区三区中文字幕| 欧美午夜精彩| 西西人体一区二区| 久久精品亚洲国产奇米99| 国产专区欧美专区| 久久影音先锋| 91久久在线观看| 亚洲视频电影图片偷拍一区| 国产精品草莓在线免费观看| 亚洲男同1069视频| 免费看av成人| 亚洲精品免费在线播放| 欧美日韩国产精品一卡| 中文在线不卡| 午夜在线成人av| 国内精品久久久久久久影视麻豆 | 久久久久久97三级| 欧美国产第一页| aaa亚洲精品一二三区| 欧美日韩精品免费在线观看视频| 亚洲图片欧美午夜| 欧美日韩国产精品成人| 国产精品99久久不卡二区| 久久本道综合色狠狠五月| 又紧又大又爽精品一区二区| 欧美精品在线观看| 亚洲欧美制服另类日韩| 欧美成人午夜激情在线| 亚洲综合丁香| 亚洲国产精品热久久| 欧美日韩在线另类| 欧美一区二区视频观看视频| 欧美激情区在线播放| 亚洲摸下面视频| 亚洲国产美国国产综合一区二区| 欧美日韩美女| 久久久午夜视频| 亚洲一区二区三区高清| 欧美激情一区二区三区蜜桃视频| 亚洲一区二区黄色| 亚洲国产另类久久精品| 国产精品影音先锋| 欧美精彩视频一区二区三区| 欧美一区二区三区的| 日韩午夜黄色| 亚洲国产另类久久久精品极度| 亚洲一区中文字幕在线观看| 一区二区三区自拍| 国产精品女主播一区二区三区| 奶水喷射视频一区| 久久黄色级2电影| 亚洲一区一卡| 日韩亚洲欧美成人一区| 亚洲国产成人av好男人在线观看| 久久久久综合网| 欧美在线一二三四区| 亚洲亚洲精品三区日韩精品在线视频|