C++(15):默认值(default)
目录
二、应用场景
1. 函数参数的默认值
代码示例
2. 构造函数的默认参数
代码示例
3. 变量的默认初始化
代码示例
四、默认值的优势
五、注意事项
一、核心概念
默认值 是为函数参数或变量预先设定的默认值。当调用者未显式提供数据时,程序自动使用该默认值,确保程序的确定性和健壮性。
必须在函数声明中声明默认参数!
函数声明就是函数的身份证,外部调用方不看定义只看声明。
int test(int n,int m = 1);
二、应用场景
1. 函数参数的默认值
在函数声明中为参数指定默认值,调用时可选择性省略参数。
代码示例
#include <iostream>// 参数 b 和 prefix 有默认值
void printMessage(const std::string& message, bool addNewline = true, // 默认换行const std::string& prefix = "") // 默认无前缀
{std::cout << prefix << message;if (addNewline) std::cout << "\n";
}int main() {printMessage("Hello"); // 输出: Hello(换行)printMessage("World", false); // 输出: World(不换行)printMessage("C++", true, ">> "); // 输出: >> C++(换行)return 0;
}
关键规则:
-
默认参数必须从右到左连续设置,不能左侧有默认值而右侧没有。
-
默认值通常在函数声明中指定(头文件),而非函数定义。
-
没传实参 ->用默认值;传了实参 ->用传进来的。
int test(int n,int m = 1);int test(int n, int m){int ans = 1;for(int i = 0;i < m; i++){ans *= n;}return ans;
}int main(){cout<< power(5);//没传实参 ->用默认值,m=1cout <<power(4,3);//传了实参 ->用传进来的,m=3
}
2. 构造函数的默认参数
为类的构造函数参数设置默认值,允许灵活初始化对象。
代码示例
#include <iostream>class Rectangle {
public:// 构造函数:width 和 height 有默认值Rectangle(int w = 10, int h = 5) : width(w), height(h) {}void printArea() {std::cout << "Area: " << width * height << "\n";}private:int width, height;
};int main() {Rectangle rect1; // 使用默认值 width=10, height=5rect1.printArea(); // 输出: Area: 50Rectangle rect2(20); // width=20, height=5(默认)rect2.printArea(); // 输出: Area: 100Rectangle rect3(15, 3); // width=15, height=3rect3.printArea(); // 输出: Area: 45return 0;
}
3. 变量的默认初始化
在变量声明时直接赋予默认值(C++11 起支持类成员直接初始化)。
代码示例
class Config {
public:int maxConnections = 100; // 类成员默认值std::string logPath = "/var/log/app.log";
};int main() {Config config;std::cout << config.maxConnections; // 输出 100return 0;
}
四、默认值的优势
优点 | 说明 |
---|---|
简化调用 | 调用者无需传递所有参数,降低使用复杂度。 |
代码灵活性 | 兼容新旧代码(新增参数可为旧代码提供默认值)。 |
防止未定义行为 | 避免因参数缺失导致程序行为不确定(如未初始化的变量)。 |
五、注意事项
-
默认参数顺序
默认值必须放在右边,必须从右到左连续设置,以下为错误示例:void func(int a = 1, int b); // 错误!左侧有默认值,右侧未设置
-
避免头文件与实现文件冲突
默认值应在函数声明(头文件)中指定,而非实现文件:// 头文件(正确) void logError(const std::string& msg, int severity = 1);// 实现文件(错误!重复指定默认值) void logError(const std::string& msg, int severity = 1) { /*...*/ }
-
谨慎使用默认值
过度使用可能导致代码可读性下降(需明确何时覆盖默认值)。