函数进阶

内容简介

C++ 在 C 函数基础上增加了默认参数、函数重载、引用参数、函数对象等能力。这些特性让接口更灵活,但也更需要清晰的设计。

用法

默认参数

int add(int a, int b = 20, int c = 30)
{
    return a + b + c;
}
 
std::cout << add(10) << std::endl;      // 60
std::cout << add(10, 30) << std::endl;  // 70

函数重载

void print(int value);
void print(double value);
void print(const std::string& value);

同一作用域下,函数名相同但参数类型、数量或顺序不同,即可构成重载。

函数对象

class Add {
public:
    int operator()(int a, int b) const
    {
        return a + b;
    }
};
 
Add add;
std::cout << add(1, 2) << std::endl;

谓词

返回 bool 的可调用对象常被称为谓词。

auto is_even = [](int value) {
    return value % 2 == 0;
};

最佳代码实践

  • 默认参数从右往左设置;一旦某个参数有默认值,右侧参数也必须有默认值。
  • 默认参数只在声明处写一次,不要在声明和定义中重复写。
  • 重载应表达同一语义下的不同参数形式,不要把无关功能硬塞同名函数。
  • 现代 C++ 中简单函数对象优先用 lambda。

错误用法

int func(int a = 10, int b);  // 错误:默认参数右侧不能没有默认值
int func(int a);
double func(int a);  // 错误:不能只靠返回值重载
int func(int a = 10);
int func(int a = 10) { return a; }  // 错误:默认参数重复定义

注意事项

  • 默认参数在编译期绑定,虚函数中使用默认参数时尤其要谨慎。
  • 重载和默认参数混用可能造成二义性。
  • 函数对象是 STL 算法、lambda、谓词的基础。

相关:cpp运算符重载lambdaSTL初识

学习路径