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

高品質 C++/C 程式設計指南 第 6 章 (三):函數內部實現規範與斷言藝術

     編輯:關於C++

6.2 返回值傳遞方式抉擇 (續)

String 相加運算子:必須值傳回


String operator+(const String& s1, const String& s2) {
    String temp;
    // ... 組合 s1+s2 到 temp ...
    return temp; // ✅ 值傳回:編譯器優化 (NRVO) 直接在呼叫端構建
}

若改引用傳回:return temp; 返回區域物件參考 → **懸空參考**,呼叫端 c = a + b 拿到垃圾,埋下禍根。

6.3 函數體入口與出口嚴把關

規則核心內容
規則 6-3-1入口:檢查參數有效性。善用 assert 防非法參數。
規則 6-3-2出口:檢查 return 正確性與效能。

return 禁忌與最佳實踐

  1. 絕不返回棧記憶體指標/參考:
    
    char* Func() {
        char str[] = "hello"; // 棧上
        return str; // ❌ 函數結束 str 銷毀
    }
    
  2. 搞清返回實體:值 / 指標 / 參考,三者語義天差地別。
  3. 返回物件時的效能陷阱:
    
    // ❌ 低效:建構 temp → 拷貝建構到返回值槽 → 析構 temp
    String temp(s1 + s2);
    return temp;
    
    // ✅ 高效:臨時物件語法,編譯器直接在返回值槽構建 (NRVO/RVO)
    return String(s1 + s2);
    
    // 內建型別同理
    return int(x + y); // ✅ 簡潔高效
    // vs
    int temp = x + y; return temp; // 多餘
    

6.4 其他建議精選

  • 建議 6-4-1:功能單一,拒多用途函數。
  • 建議 6-4-2:函數體 ≤ 50 行。
  • 建議 6-4-3:避免「記憶」功能 (相同輸入 → 相同輸出);static 區域變數即記憶體,慎用。
  • 建議 6-4-4:檢查所有輸入來源 (參數、全域變數、檔案句柄...)。
  • 建議 6-4-5:錯誤碼設計清晰,不可被忽視或誤解。

6.5 斷言:Debug 版的守護神


void* memcpy(void* pvTo, const void* pvFrom, size_t size) {
    assert((pvTo != nullptr) && (pvFrom != nullptr)); // 僅 Debug 生效
    byte* pbTo = (byte*)pvTo;
    byte* pbFrom = (byte*)pvFrom;
    while (size-- > 0) *pbTo++ = *pbFrom++;
    return pvTo;
}
  • assert 是**巨集**,非函數,**零副作用**,Debug/Release 行為一致。
  • 觸發 assert = **呼叫端有錯**,非函數本身錯;助快速定位根因。
  • 註釋說明斷言意圖,免除後人「不知斷言檢查何事」之苦。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved