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

高品質 C++/C 程式設計指南 第 8 章 (四):預設參數與運算子多載規範

     編輯:關於C++

8.3 預設參數:簡潔與二義性的雙面刃

核心規則

  1. 只能出現在宣告,不可在定義體重複。
    void Foo(int x = 0, int y = 0); // ✅ 宣告
    void Foo(int x = 0, int y = 0) { ... } // ❌ 定義體中非法
    原因:實作與預設值無關;預設值常變動,改宣告比改定義容易。
  2. 從右向左連續預設,不可跳躍。
    void Foo(int x, int y = 0, int z = 0); // ✅
    void Foo(int x = 0, int y, int z = 0); // ❌ 調用時極易混淆

二義性陷阱

void output(int x);
void output(int x, float y = 0.0f); // 預設參數

output(1); // ❌ 編譯錯誤:ambiguous call
// 編譯器不知呼叫 output(int) 還是 output(int, float=0.0f)

**教訓**:預設參數僅簡化書寫,**不增加新功能**,濫用降低可讀性並引發重載二義性,**慎用**。

8.4 運算子多載:語法糖的規範藝術

概念

Complex Add(const Complex& a, const Complex& b); // 普通函數
Complex operator+(const Complex& a, const Complex& b); // 運算子多載

Complex a, b, c;
c = Add(a, b); // 普通調用
c = a + b;     // 運算子調用,參數分居左右

全域函數 vs 成員函數

形式一元運算子二元運算子
全域函數1 參數2 參數 (左、右)
成員函數0 參數 (隱含 *this)1 參數 (右側,左側為 *this)

重載形式選擇規則 (摘自 Murray)

運算子類別建議
所有一元運算子成員函數
= () [] ->只能 為成員函數
+= -= *= /= &= |= %= >>= <<=成員函數
其他所有運算子全域函數 (常需友元存取私有成員)

遵循規則可保持語義直覺、介面一致、存取控制合理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved