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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.