C++函数中默认参数允许在声明或定义函数时为部分参数指定默认值,调用时若未传入对应参数则使用默认值;可变参数则支持函数接收数量不定的参数,两种特性都能让函数适配更多调用场景。

C++默认参数的使用
默认参数的定义规则
默认参数可以在函数声明或定义时指定,但通常建议在函数声明处设置,避免多个定义处默认值不一致的问题。默认参数必须从右向左依次定义,即如果一个参数有默认值,那么它右侧的所有参数都必须有默认值。
// 函数声明,设置默认参数
void print_info(int id, const char* name = "unknown", int age = 0);
// 函数定义,不需要重复写默认参数
void print_info(int id, const char* name, int age) {
printf("id: %d, name: %s, age: %dn", id, name, age);
}
int main() {
print_info(1); // 使用两个默认参数,输出 id: 1, name: unknown, age: 0
print_info(2, "Tom"); // 使用一个默认参数,输出 id: 2, name: Tom, age: 0
print_info(3, "Alice", 20); // 不使用默认参数,输出 id: 3, name: Alice, age: 20
return 0;
}
默认参数的注意事项
- 默认参数不能是局部变量,必须是全局变量、静态变量或者常量表达式。
- 如果函数有声明和定义分离,默认参数只能出现在声明中,定义中不能重复指定,否则会导致编译错误。
- 调用带默认参数的函数时,传入的参数会从左到右依次匹配形参,不会跳过已有默认值的参数去匹配后面的参数。
C++可变参数的使用
C风格可变参数
C++兼容C语言的风格可变参数,使用stdarg.h头文件中的宏来解析参数,这类可变参数要求至少有一个固定参数,且需要开发者手动指定可变参数的数量和类型。
#include <stdarg.h>
#include <cstdio>
// 计算多个整数的和,第一个参数count表示后续可变参数的数量
int sum(int count, ...) {
va_list args;
va_start(args, count); // 初始化args,指向第一个可变参数
int total = 0;
for (int i = 0; i < count; i++) {
total += va_arg(args, int); // 依次取出每个int类型的可变参数
}
va_end(args); // 结束可变参数获取
return total;
}
int main() {
printf("sum: %dn", sum(3, 1, 2, 3)); // 输出 sum: 6
printf("sum: %dn", sum(5, 10, 20, 30, 40, 50)); // 输出 sum: 150
return 0;
}
C风格可变参数的缺点是没有类型检查,传入参数类型和va_arg指定的类型不匹配时会导致未定义行为,而且需要手动传递参数数量,容易出错。
C++11可变参数模板
C++11引入了可变参数模板,支持类型安全的可变参数,不需要手动指定参数数量和类型,编译器会自动推导参数类型,是更推荐的可变参数实现方式。
#include <cstdio>
// 递归终止函数,处理最后一个参数
void print_args() {
printf("n");
}
// 可变参数模板函数,递归处理每个参数
template <typename T, typename... Args>
void print_args(T first, Args... rest) {
printf("%d ", first);
print_args(rest...); // 递归调用,参数包展开
}
int main() {
print_args(1, 2, 3, 4, 5); // 输出 1 2 3 4 5
print_args(10, 20, 30); // 输出 10 20 30
return 0;
}
可变参数模板通过参数包Args...接收不定数量的参数,利用递归模板实例化逐步展开参数包,既保证了类型安全,又不需要手动管理参数数量,功能比C风格可变参数更强大。
两者的适用场景对比
| 特性 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 默认参数 | 函数有部分参数在大多数调用场景下取值固定 | 调用简洁,减少重复传参 | 只能减少固定位置的传参,参数数量固定 |
| 可变参数 | 函数需要接收数量不定的参数 | 适配不同数量的参数输入 | C风格无类型检查,可变参数模板语法相对复杂 |
在实际开发中,优先选择默认参数处理固定取值的常用参数,需要接收不定数量参数时优先使用C++11可变参数模板,避免使用C风格可变参数减少出错概率。
C++默认参数可变参数variadic_function修改时间:2026-06-23 04:12:32