函数进阶
内容简介
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、谓词的基础。
学习路径
- 上一节:cppNewAndDelete操作符
- 当前阶段:cpp进阶编程
- 下一节:cpp命名空间