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

C++ 函數預設參數完整指南

     編輯:C++ 基礎

核心語法:參數列表中直接給預設值

void func(int n, float b = 1.2, char c = '@') {
    cout << n << ", " << b << ", " << c << endl;
}

int main() {
    func(10, 3.5, '#'); // 10, 3.5, #
    func(20, 9.8);      // 20, 9.8, @  (c 使用預設值)
    func(30);           // 30, 1.2, @  (b, c 皆用預設值)
    return 0;
}

鐵律:預設參數必須連續且靠右

// ✅ 合法
void f1(int a, int b = 10, int c = 20);
void f2(int a, int b, int c = 20);

// ❌ 非法:預設參數後出現無預設參數
void f3(int a, int b = 10, int c = 20, int d);
void f4(int a, int b = 10, int c, int d = 20);

原因:實參從左至右依序匹配,中間有「洞」編譯器無法判斷意圖。

預設值可為運算式

float base = 10.8;
void func(int n, float b = base + 2.9, char c = '@'); // 合法,執行期求值

宣告 vs 定義:在哪裡寫預設值?

  • **僅有定義**(無單獨宣告):定義處寫預設值。
  • **有宣告(頭文件)與定義(.cpp)分離**:**只能在宣告處寫**,定義處**不可**重複寫(會導致重複定義錯誤)。
// MyLib.h
void foo(int a, int b = 10); // 宣告處給預設值

// MyLib.cpp
#include "MyLib.h"
void foo(int a, int b) {     // 定義處「不寫」預設值
    // ...
}

這確保同一翻譯單元內只有一處預設值,避免一致性問題。

實務價值:減少重載數量

// 無預設參數:需 3 個重載
void drawRect(int x, int y);
void drawRect(int x, int y, int w);
void drawRect(int x, int y, int w, int h);

// 有預設參數:1 個函數涵蓋所有
void drawRect(int x = 0, int y = 0, int w = 100, int h = 100);

常見陷阱

陷阱現象對策
虛擬函數預設參數靜態綁定:基類指標呼叫派生類虛擬函數,使用**基類宣告的預設值**虛擬函數避免使用預設參數,或基類派生類保持一致
預設參數修改需重編譯所有呼叫端頭文件改預設值 → 所有包含該頭文件的 .cpp 需重編譯預設值相對穩定時使用;頻繁變動改用重載
預設參數為暫時物件void f(const string& s = string("")) 每次呼叫建構臨時物件改用 const char* 或 C++17 string_view

總結

  • 語法簡單:參數列表 type name = value。
  • 規則嚴格:靠右連續、宣告處唯一、虛擬函數慎用。
  • 工程價值:減少重載爆炸、簡化介面、提供合理預設行為。
  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved