第五节 · 自助服务 · 默认实参与函数指针

在餐厅点餐时,如果你不特别说明,服务员可能会给你提供标准的配菜和调料。但如果你有特殊要求,也可以自己指定。

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 = addoperation = &add 是等价的。


函数指针作为参数

函数指针的一个重要用途是作为参数传递给其他函数,实现回调机制:

这种模式允许我们编写更加灵活和通用的代码。


用 typedef 简化函数指针

函数指针的语法比较复杂,可以用 typedefusing 来简化:


函数指针数组

我们甚至可以创建函数指针的数组:

输出:


返回函数指针的函数

函数也可以返回函数指针:


在现代 C++ 中,我们通常会使用更高级的特性(如 lambda 表达式和 std::function)来替代原始的函数指针,但理解函数指针的概念对于理解这些高级特性非常有帮助。

习题

  • 编写一个函数 repeat,接受一个字符串、一个重复次数(默认为 2)和一个分隔符(默认为空格),输出重复后的字符串。

  • 实现一个简单的计算器,使用函数指针数组来选择执行加减乘除运算。

Last updated