程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 高質量C++/C編程指南-第6章-函數設計(1)

高質量C++/C編程指南-第6章-函數設計(1)

編輯:關於C++

函數是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);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved