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

C++ 進階特性:參數預設值與運算子多載詳解

     編輯:VC 教學

8.3 參數的預設值

在函式呼叫時,若某些參數的值固定不變,每次都傳遞相同數值會顯得冗贅。C++ 提供了參數預設值機制,讓編譯器在編譯期自動填入預設值,大幅簡化程式碼撰寫。

使用規則

規則 8-3-1:預設值只能出現在宣告中

參數預設值必須放在函式宣告(declaration)處,而非定義(definition)處。

// 正確:預設值在宣告中
void Foo(int x = 0, int y = 0);

// 錯誤:預設值在定義中
void Foo(int x = 0, int y = 0) {
    // ...
}

原因分析:

  1. 函式實作與參數是否有預設值無關,無需在定義處重複。
  2. 預設值可能隨需求變更,修改宣告比修改定義更方便(尤其當定義在 .cpp 檔案中時)。

規則 8-3-2:預設參數必須從右向左連續設定

若函式有多個參數,只有尾部參數能設定預設值,否則呼叫時會產生歧義。

// 正確
void Foo(int x, int y = 0, int z = 0);

// 錯誤:中間參數有預設值但後面沒有
void Foo(int x = 0, int y, int z = 0);

預設值的雙面效應

預設值雖能提高易用性,但濫用會降低程式碼可讀性,甚至導致函式多載產生歧義。例如:

#include <iostream>
using namespace std;

void output(int x);
void output(int x, float y = 0.0);

void output(int x) {
    cout << "output int " << x << endl;
}

void output(int x, float y) {
    cout << "output int " << x << " and float " << y << endl;
}

int main() {
    int x = 1;
    float y = 0.5;
    // output(x); // 錯誤:ambiguous call
    output(x, y); // 正常:output int 1 and float 0.5
    return 0;
}

呼叫 output(x) 時,編譯器無法判斷是呼叫單參數版本,還是雙參數版本並使用預設值,因而報錯。實務上應謹慎使用預設值,避免與多載函式衝突。


8.4 運算子多載

8.4.1 基本概念

C++ 允許使用 operator 關鍵字重新定義運算子行為,使自訂型別(如複數、矩陣、字串)能像內建型別一樣使用運算子。

// 一般函式寫法
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;     // 運算子多載,參數出現在運算子左右兩側

8.4.2 成員函式 vs 全域函式

  • 全域函式:一元運算子有 1 個參數,二元運算子有 2 個參數。
  • 類別成員函式:一元運算子有 0 參數,二元運算子有 1 參數(右運算元),因為左運算元隱含為 *this。

8.4.3 重載形式選擇規則(參考 Murray)

運算子類別建議重載形式
所有一元運算子成員函式
= () [] ->只能為成員函式
+= -= /= *= &= |= ^= %= >>= <<=成員函式
所有其他運算子全域函式(常搭配 friend)

原則上,涉及物件狀態改變的賦值類運算子宜為成員函式;對稱性運算子(如 +、==、<<)宜為全域函式,以保持左右運算元地位對等。

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