人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

高質量C++/C編程向導(11)

高質量C++/C編程向導(11)

更新時間:2022-07-06 文章作者:未知 信息來源:網絡 閱讀次數:

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


  11.1.1 用const修飾函數的參數

  如果參數作輸出用,不論它是什么數據類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加const修飾,否則該參數將失去輸出功能。

  const只能修飾輸入參數:

  u 如果輸入參數采用“指針傳遞”,那么加const修飾可以防止意外地改動該指針,起到保護作用。

  例如StringCopy函數:

  void StringCopy(char *strDestination, const char *strSource);

  其中strSource是輸入參數,strDestination是輸出參數。給strSource加上const修飾后,如果函數體內的語句試圖改動strSource的內容,編譯器將指出錯誤。


  u 如果輸入參數采用“值傳遞”,由于函數將自動產生臨時變量用于復制該參數,該輸入參數本來就無需保護,所以不要加const修飾。

  例如不要將函數void Func1(int x) 寫成void Func1(const int x)。同理不要將函數void Func2(A a) 寫成void Func2(const A a)。其中A為用戶自定義的數據類型。


  u 對于非內部數據類型的參數而言,象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修飾函數的返回值

  u 如果給以“指針傳遞”方式的函數返回值加const修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const修飾的同類型指針。

  例如函數

  const char * GetString(void);

  如下語句將出現編譯錯誤:

  char *str = GetString();

  正確的用法是

  const char *str = GetString();


  u 如果函數返回值采用“值傳遞方式”,由于函數會把返回值復制到外部臨時的存儲單元中,加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節“返回值的規則”。


  u 函數返回值采用“引用傳遞”的場合并不多,這種方式一般只出現在類的賦值函數中,目的是為了實現鏈式表達。

  例如

  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 則是非法的。


  

[1] [2]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 神池县| 阜南县| 金平| 琼海市| 玛多县| 海盐县| 信阳市| 建湖县| 承德市| 岗巴县| 曲松县| 霍林郭勒市| 陈巴尔虎旗| 翁牛特旗| 庄河市| 修武县| 岑溪市| 南召县| 卢湾区| 沂南县| 临城县| 日土县| 鄂伦春自治旗| 阳江市| 温州市| 子洲县| 新邵县| 新营市| 河池市| 元谋县| 大荔县| 新建县| 南漳县| 隆德县| 将乐县| 辽宁省| 宜章县| 陕西省| 辽阳市| 勃利县| 拜泉县|