首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C/C++ 函式設計精要(一):參數與回傳值的介面設計規範

     編輯:VC 教學

第 6 章 函式設計

函式是程式基本功能單元,功能正確不夠,介面設計缺失極易導致誤用。本章聚焦介面設計(參數、回傳值)與內部實作規則。

C 語言參數/回傳傳遞:傳值、傳指標。C++ 新增傳參考。參考傳遞性質似指標、用法似傳值,初學者易混淆,請先閱讀 6.6 節「參考與指標比較」。

6.1 參數規則

規則 6-1-1:參數宣告須完整,勿省略參數名

void SetValue(int width, int height); // 良好
void SetValue(int, int);              // 不良
float GetValue(void);                 // 良好
float GetValue();                     // 不良

規則 6-1-2:參數命名具意義、順序合乎慣例

字串拷貝函式 StringCopy:

  • 參數名 str1, str2 → 無法判斷誰是來源誰是目的。
  • 改為 strSource, strDestination → 一目瞭然。
  • 順序慣例:目的參數在前,來源參數在後(如 strcpy(dest, src))。若宣告為 StringCopy(src, dest),呼叫端極易寫反:StringCopy(str, "Hello") 實際想複製 "Hello" 到 str,卻反過來了。

規則 6-1-3:輸入指標參數加 const 保護

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

防止函式體內意外修改輸入指標指向的內容。

規則 6-1-4:輸入參數為物件時,改用 const 參考傳遞提升效率

傳值會產生暫時物件(建構+複製+解構開銷),const A& 僅借用別名,無額外開銷。

建議 6-1-1:參數個數控制在 5 個以內

過多易搞錯型別與順序。

建議 6-1-2:避免不定型別/不定個數參數

如 printf,編譯期喪失嚴格型別檢查。

6.2 回傳值規則

規則 6-2-1:不可省略回傳型別

C 允許無型別預設為 int,易誤解為 void。C++ 嚴格檢查不允許。無回傳值須宣告 void。

規則 6-2-2:函式名與回傳型別語意不可衝突

經典反例:C 標準庫 getchar。名稱暗示回傳 char,實際回傳 int(為容納 EOF 通常為 -1)。導致:

char c = getchar();
if (c == EOF) ... // 若 EOF 不在 char 範圍內,判斷永遠失敗

責任在函式設計者誤導使用者,非使用者之過。

規則 6-2-3:正常值與錯誤碼分離回傳

正常值用輸出參數取得,錯誤碼用 return 回傳。

// 改良版
BOOL GetChar(char* c); // 回傳成功與否,字元經由輸出參數帶回

雖 getchar 靈活(如 putchar(getchar())),但用錯時靈活性無用。

建議 6-2-1:為支援鏈式運算可附加回傳值

如 strcpy 回傳 strDest,可寫 strlen(strcpy(str, "Hello"))。

建議 6-2-2:回傳物件時,視情況以參考替代傳值提升效率

  • 指派運算子:回傳 *this 參考,避免複製開銷。a = b = c 若傳值會產生多次複製。
  • 加法運算子:必須傳值。回傳區域物件 temp 的參考會導致懸空參考(temp 函式結束時銷毀)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved