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

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

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

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

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

第6章 函數設計
  函數是C++/C程序的基本功能單元,其重要性不言而喻。函數設計的細微缺點很容易導致該函數被錯用,所以光使函數的功能正確是不夠的。本章重點論述函數的接口設計和內部實現的一些規則。
  函數接口的兩個要素是參數和返回值。C語言中,函數的參數和返回值的傳遞方式有兩種:值傳遞(pass by value)和指針傳遞(pass by pointer)。C++ 語言中多了引用傳遞(pass by reference)。由于引用傳遞的性質象指針傳遞,而使用方式卻象值傳遞,初學者常常迷惑不解,容易引起混亂,請先閱讀6.6節“引用與指針的比較”。

  6.1 參數的規則
  l 【規則6-1-1】參數的書寫要完整,不要貪圖省事只寫參數的類型而省略參數名字。如果函數沒有參數,則用void填充。

  例如:

  void SetValue(int width, int height); // 良好的風格

  void SetValue(int, int); // 不良的風格

  float GetValue(void); // 良好的風格

  float GetValue(); // 不良的風格


  l 【規則6-1-2】參數命名要恰當,順序要合理。

  例如編寫字符串拷貝函數StringCopy,它有兩個參數。如果把參數名字起為str1和str2,例如

  void StringCopy(char *str1, char *str2);

  那么我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來。

  可以把參數名字起得更有意義,如叫strSource和strDestination。這樣從名字上就可以看出應該把strSource拷貝到strDestination。

  還有一個問題,這兩個參數那一個該在前那一個該在后?參數的順序要遵循程序員的習慣。一般地,應將目的參數放在前面,源參數放在后面。

  如果將函數聲明為:

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

  別人在使用時可能會不假思索地寫成如下形式:

  char str[20];

  StringCopy(str, “Hello World”); // 參數順序顛倒


  l 【規則6-1-3】如果參數是指針,且僅作輸入用,則應在類型前加const,以防止該指針在函數體內被意外修改。

  例如:

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


  l 【規則6-1-4】如果輸入參數以值傳遞的方式傳遞對象,則宜改用“const &”方式來傳遞,這樣可以省去臨時對象的構造和析構過程,從而提高效率。


  2 【建議6-1-1】避免函數有太多的參數,參數個數盡量控制在5個以內。如果參數太多,在使用時容易將參數類型或順序搞錯。


  2 【建議6-1-2】盡量不要使用類型和數目不確定的參數。

  C標準庫函數printf是采用不確定參數的典型代表,其原型為:

  int printf(const chat *format[, argument]…);

  這種風格的函數在編譯時喪失了嚴格的類型安全檢查。

  6.2 返回值的規則
  l 【規則6-2-1】不要省略返回值的類型。

  C語言中,凡不加類型說明的函數,一律自動按整型處理。這樣做不會有什么好處,卻容易被誤解為void類型。

  C++語言有很嚴格的類型安全檢查,不允許上述情況發生。由于C++程序可以調用C函數,為了避免混亂,規定任何C++/ C函數都必須有類型。如果函數沒有返回值,那么應聲明為void類型。


  l 【規則6-2-2】函數名字與返回值類型在語義上不可沖突。

  違反這條規則的典型代表是C標準庫函數getchar。

  例如:

  char c;

  c = getchar();

  if (c == EOF)

  …

  按照getchar名字的意思,將變量c聲明為char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:

  int getchar(void);

  由于c是char類型,取值范圍是[-128,127],如果宏EOF的值在char的取值范圍之外,那么if語句將總是失敗,這種“危險”人們一般哪里料得到!導致本例錯誤的責任并不在用戶,是函數getchar誤導了使用者。


  l 【規則6-2-3】不要將正常值和錯誤標志混在一起返回。正常值用輸出參數獲得,而錯誤標志用return語句返回。

  回顧上例,C標準庫函數的設計者為什么要將getchar聲明為令人迷糊的int類型呢?他會那么傻嗎?

  在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結束標志或發生讀錯誤,它必須返回一個標志EOF。為了區別于正常的字符,只好將EOF定義為負數(通常為負1)。因此函數getchar就成了int類型。

  我們在實際工作中,經常會碰到上述令人為難的問題。為了避免出現誤解,我們應該將正常值和錯誤標志分開。即:正常值用輸出參數獲得,而錯誤標志用return語句返回。

  函數getchar可以改寫成 BOOL GetChar(char *c);

  雖然gechar比GetChar靈活,例如 putchar(getchar()); 但是如果getchar用錯了,它的靈活性又有什么用呢?


  2 【建議6-2-1】有時候函數原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值。

  例如字符串拷貝函數strcpy的原型:

  char *strcpy(char *strDest,const char *strSrc);

  strcpy函數將strSrc拷貝至輸出參數strDest中,同時函數的返回值又是strDest。這樣做并非多此一舉,可以獲得如下靈活性:

  char str[20];

  int length = strlen( strcpy(str, “Hello World”) );

[1] [2]  下一頁

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

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 柏乡县| 车险| 大方县| 白玉县| 汉源县| 无锡市| 邯郸市| 界首市| 昂仁县| 钟山县| 冀州市| 宽城| 桐庐县| 嘉善县| 西充县| 尉犁县| 镇坪县| 德令哈市| 海林市| 和林格尔县| 来安县| 集贤县| 大同县| 玉溪市| 建始县| 招远市| 灵武市| 庆元县| 商南县| 巴彦县| 常山县| 策勒县| 衢州市| 海南省| 张家口市| 法库县| 满城县| 灵宝市| 科尔| 平利县| 阳西县|