函式是程式基本功能單元,功能正確不夠,介面設計缺失極易導致誤用。本章聚焦介面設計(參數、回傳值)與內部實作規則。
C 語言參數/回傳傳遞:傳值、傳指標。C++ 新增傳參考。參考傳遞性質似指標、用法似傳值,初學者易混淆,請先閱讀 6.6 節「參考與指標比較」。
void SetValue(int width, int height); // 良好
void SetValue(int, int); // 不良
float GetValue(void); // 良好
float GetValue(); // 不良
字串拷貝函式 StringCopy:
str1, str2 → 無法判斷誰是來源誰是目的。strSource, strDestination → 一目瞭然。strcpy(dest, src))。若宣告為 StringCopy(src, dest),呼叫端極易寫反:StringCopy(str, "Hello") 實際想複製 "Hello" 到 str,卻反過來了。void StringCopy(char* strDestination, const char* strSource);
防止函式體內意外修改輸入指標指向的內容。
傳值會產生暫時物件(建構+複製+解構開銷),const A& 僅借用別名,無額外開銷。
過多易搞錯型別與順序。
如 printf,編譯期喪失嚴格型別檢查。
C 允許無型別預設為 int,易誤解為 void。C++ 嚴格檢查不允許。無回傳值須宣告 void。
經典反例:C 標準庫 getchar。名稱暗示回傳 char,實際回傳 int(為容納 EOF 通常為 -1)。導致:
char c = getchar();
if (c == EOF) ... // 若 EOF 不在 char 範圍內,判斷永遠失敗
責任在函式設計者誤導使用者,非使用者之過。
正常值用輸出參數取得,錯誤碼用 return 回傳。
// 改良版
BOOL GetChar(char* c); // 回傳成功與否,字元經由輸出參數帶回
雖 getchar 靈活(如 putchar(getchar())),但用錯時靈活性無用。
如 strcpy 回傳 strDest,可寫 strlen(strcpy(str, "Hello"))。
*this 參考,避免複製開銷。a = b = c 若傳值會產生多次複製。temp 的參考會導致懸空參考(temp 函式結束時銷毀)。