默认参数与函数重载
默认实参规则、重载与默认参数的抉择、重载决议
默认参数与函数重载
默认实参让调用者可以省略某些参数,和函数重载结合使用要小心——两者可能产生歧义。
学完本章你将: 掌握默认实参规则、重载与默认参数的抉择。
默认实参
cpp
#include <iostream>
// 右侧参数才能有默认值
void greet(const std::string &name, const std::string &prefix = "你好") {
std::cout << prefix << "," << name << "!\n";
}
int main() {
greet("小明"); // 你好,小明!
greet("小红", "早上好"); // 早上好,小红!
// greet("小明", , "!"); // ❌ 不能跳过中间的参数
return 0;
}
⚠️ 默认参数必须从右向左连续给出——不存在"跳过中间的,给后面的默认值"。
默认实参 vs 函数重载
cpp
// 方式 1:默认参数
void draw(int x, int y, int color = 0) { }
// 方式 2:函数重载
void draw(int x, int y) { draw(x, y, 0); }
void draw(int x, int y, int c) { /* ... */ }
// ❌ 两者不能混用——会产生歧义
void f(int a, int b = 0) { }
void f(int a) { } // 调用 f(5) 时编译器不知道选谁
头文件中的默认实参
cpp
// header.h
void func(int a, int b = 0); // 默认值只在声明中写一次
// source.cpp
void func(int a, int b) { // 定义中不重复写默认值
// ...
}