缺省参数
缺省参数
核心定义
缺省参数是指函数在声明或定义时,为参数指定一个 “默认值”。调用函数时,若未显式传递该参数,编译器会自动使用默认值;若传递了参数,则覆盖默认值。其核心作用是减少函数重载的冗余代码,同时提升调用灵活性(尤其适用于 “可选参数” 场景)。
1 |
|
缺省参数的关键规则
缺省参数的使用有严格限制,违反会导致编译错误,需重点注意以下 5 点:
右到左指定原则
缺省参数必须从最右侧参数开始连续指定,不能跳过左侧参数给右侧参数设默认值。这是因为函数调用时参数按 “左到右” 传递,若左侧有默认值而右侧无,编译器无法判断省略的是哪个参数。
- 合法示例:
void func(int a, int b = 5, int c = 10);(从右到左设默认) - 非法示例:
void func(int a = 1, int b, int c = 3);(左侧 a 有默认,中间 b 无,违反顺序)
单处指定”原则
缺省参数只能在函数声明或定义中选择一处指定,不能两处重复定义(否则编译器无法确定默认值)。实际开发中推荐在 “声明” 中指定(如头文件.h 中),因为声明是调用者可见的接口,定义(.cpp 中)可能隐藏在实现文件中。
- 非法示例:
1 | // 头文件声明(已指定默认值) |
常量性要求
缺省参数的默认值必须是编译期可确定的常量表达式,或全局 / 静态变量(局部变量不可用,因局部变量生命周期与函数调用无关,可能被销毁)。
- 合法示例:
1 | const int GLOBAL_NUM = 10; |
- 非法示例:
1 | void outer() { |
与函数重载
文档 “语言” 部分明确提到 “函数 − 重载”,而缺省参数若使用不当,会与重载函数产生二义性(编译器无法判断调用哪个函数),需特别规避。
- 二义性示例:
1 | // 重载函数1:无参数 |
类成员函数特殊限制
若缺省参数用于类的非静态成员函数,默认值不能直接访问类的非静态成员变量(因非静态成员属于对象实例,函数调用时可能未构造对象,无法确定成员值)。
- 非法示例:
1 | class A { |
缺省参数的典型应用场景
结合文档中 “容器库”“字符串库” 等标准库设计思路,缺省参数在实际开发中常见于以下场景:
简化构造函数重载
避免为 “可选成员变量” 编写多个重载构造函数,用缺省参数直接指定默认值(如标准库std::string的构造:std::string(size_t n = 0, char c = '\0'))。
1 | class Person { |
可选配置参数
函数的 “非必需配置项” 用缺省参数指定默认行为(如日志函数的 “日志级别” 默认设为 “INFO”,文件读取函数的 “编码格式” 默认设为 “UTF-8”)。
1 | enum class LogLevel { INFO, WARN, ERROR }; |





