C++ 缺省参数(默认参数)
一、什么是缺省参数
缺省参数 = 函数参数给一个默认值
调用函数时:
传了实参:用你传的值
没传实参:自动用默认值
二、基础语法
返回值 函数名(参数1, 参数2 = 默认值);三、基础示例代码
示例 1:单个默认参数
#include <iostream> using namespace std; // 给 b 设置缺省值 10 void func(int a, int b = 10) { cout << "a = " << a << ", b = " << b << endl; } int main() { // 只传一个参数,b用默认值 func(5); // 传两个参数,覆盖默认值 func(5, 20); return 0; }运行结果:
a = 5, b = 10 a = 5, b = 20四、核心规则 1:有默认值的参数必须靠右
❌ 错误写法:
// 非法:左边有默认,右边没有 void test(int a = 10, int b);✅ 正确写法:从右往左连续给默认值
#include <iostream> using namespace std; void test(int a, int b = 20, int c = 30) { cout << a << " " << b << " " << c << endl; } int main() { test(1); // a=1,b、c用默认 test(1, 2); // a=1,b=2,c用默认 test(1, 2, 3); // 全部自己传 return 0; }运行结果:
1 20 30 1 2 30 1 2 3记住:默认参数只能从最右边开始给,不能中间隔一个不给。
五、核心规则 2:声明和定义只能给一次默认值
错误示范(重复给默认)
// 声明给了默认 void fun(int x = 100); // 定义又给一遍,编译报错 void fun(int x = 100) { cout << x << endl; }正确规范
写在函数声明上,定义不写
#include <iostream> using namespace std; // 声明给缺省值 void fun(int x = 100); // 定义只写参数类型,不写默认值 void fun(int x) { cout << "x = " << x << endl; } int main() { fun(); // 用默认 fun(200); // 传参覆盖 return 0; }六、核心规则 3:缺省参数可以是常量、全局变量、表达式
#include <iostream> using namespace std; int g = 50; // 默认值可以用全局变量、表达式 void show(int a, int b = g + 10) { cout << a << " " << b << endl; } int main() { show(10); show(10, 100); return 0; }运行结果:
10 60 10 100七、缺省参数 与 函数重载 坑点(重点易错)
缺省参数容易和重载产生二义性,编译器不知道该调用哪个。
错误示例(编译报错)
#include <iostream> using namespace std; void f(int a) { cout << "f(int)" << endl; } // 有缺省参数 void f(int a, int b = 10) { cout << "f(int,int)" << endl; } int main() { // 报错!分不清调用哪个f f(5); return 0; }原因:
f(5)既可以匹配f(int),也可以匹配f(int,int)(b 用默认),产生歧义。
八、无参函数缺省参数
#include <iostream> using namespace std; void hello(string s = "Hello C++") { cout << s << endl; } int main() { hello(); // 用默认 hello("你好"); // 自己传 return 0; }九、知识点总结(必背)
缺省参数:函数参数给默认值,不传参就用默认。
规则:默认参数必须从右往左连续定义,不能穿插。
声明和定义只能一处写默认值,推荐写在声明。
默认值可以是:常量、全局变量、合法表达式。
缺省参数容易和函数重载产生二义性,要避免。
调用时:传了实参就覆盖默认,没传就用默认。