第五节 · 自助服务 · 默认实参与函数指针
在餐厅点餐时,如果你不特别说明,服务员可能会给你提供标准的配菜和调料。但如果你有特殊要求,也可以自己指定。
C++ 函数的默认实参就是这样一种机制——你可以为参数提供一个默认值,调用时如果不提供该参数,就使用默认值。
默认实参
来看一个简单的例子:
void greet(string name = "朋友")
{
cout << "你好, " << name << "!" << endl;
}
int main()
{
greet("小明"); // 输出: 你好, 小明!
greet(); // 输出: 你好, 朋友!(使用默认值)
return 0;
}定义默认实参时,只需在参数后面加上 = 默认值 即可。
规则一:默认实参必须从右往左连续提供
// 正确
void func1(int a, int b = 10, int c = 20);
// 错误!不能跳过中间的参数
void func2(int a = 10, int b, int c = 20); // 编译错误
// 正确
void func3(int a, int b, int c = 20);
// 正确
void func4(int a = 1, int b = 2, int c = 3);规则二:调用时省略的参数也必须从右往左连续
规则三:默认值只能在声明中指定一次
通常,默认值放在函数声明中(头文件里),而不是定义中(源文件里)。
默认实参的实际应用
默认实参在实际开发中非常有用,可以简化函数调用:
函数指针
在 C++ 中,函数也是一种数据,可以被存储和传递。函数指针就是指向函数的指针。
函数指针的声明语法:
看一个例子:
函数名本身就代表函数的地址,所以 operation = add 和 operation = &add 是等价的。
函数指针作为参数
函数指针的一个重要用途是作为参数传递给其他函数,实现回调机制:
这种模式允许我们编写更加灵活和通用的代码。
用 typedef 简化函数指针
函数指针的语法比较复杂,可以用 typedef 或 using 来简化:
函数指针数组
我们甚至可以创建函数指针的数组:
输出:
返回函数指针的函数
函数也可以返回函数指针:
在现代 C++ 中,我们通常会使用更高级的特性(如 lambda 表达式和 std::function)来替代原始的函数指针,但理解函数指针的概念对于理解这些高级特性非常有帮助。
习题
编写一个函数
repeat,接受一个字符串、一个重复次数(默认为 2)和一个分隔符(默认为空格),输出重复后的字符串。实现一个简单的计算器,使用函数指针数组来选择执行加减乘除运算。
Last updated