总览
主要讲了 c++ 中函数的默认/占位参数以及函数重载的基本语法和注意事项
函数默认参数
在 c++中,函数的形参列表中的形参是可以有默认值的
语法:返回值类型 函数名 (参数=默认值) {}
这块感觉和 python 相似,python 中有这样的语法,没记错的话是基于 default 元组实现的;
Java 是不支持的,可以用重载来实现,不知道后续是否会增加(提个 issue 试试hh)
todo:后续学习深入了之后,看下 c++ 这块怎么实现的
#include <iostream>
using namespace std;
int sum(int a, int b, int c) {
return a + b + c;
}
// 如果某个参数已经有了默认值,那么从这个参数开始后续的都需要有默认值
int sum1(int a, int b = 20, int c = 30) {
return a + b + c;
}
// 默认参数不允许重定义,编译器不知道该用哪个
// 声明和实现只能有一个定义默认参数
int sum3(int a = 10, int b = 20); // 声明
int sum3(int a, int b) { // 实现
return a + b;
}
int main() {
// 60
cout << sum(10, 20, 30) << endl;
// 60
cout << sum1(10) << endl;
return 0;
}
函数占位参数
c++中形参列表中可以有占位参数,用来做占位,调用的时候必须填补该位置
语法:返回值类型 函数名(数据类型){}
#include <iostream>
using namespace std;
// 1. 目前阶段占位参数用不到,因为传的 50在函数里根本拿不到
// 2. 占位参数可以有默认参数
int sum(int a, int = 20) {
return a;
}
int main() {
cout << sum(10, 50) << endl;
return 0;
}
函数重载
概述
作用:函数名可以相同,参数不同,可以根据参数的类型和数量为函数提供不同的语义
本质上还是抽象,因为必然存在一些功能可以允许不同的参数,比如 add 相加,相加可以是数字也可以是自定义的类型,但是抽象来看其实都是加的这一个概念。如果没有重载,就需要有很多命名的函数,比如 add_int,add_double,add_xxx
条件
- 同一个作用域下
- 函数名称相同
- 参数的类型不同或者参数的数量不同
和 Java 的定义完全一致
#include <iostream>
using namespace std;
int sum(double a, double b) {
return a + b;
}
int sum(int a, int b) {
return a + b;
}
int sum(int a) {
return a;
}
int main() {
cout << sum(10, 50) << endl;
cout << sum(10.2, 5.3) << endl;
cout << sum(10) << endl;
return 0;
}
注意事项
- 引用作为重载条件:int 和 const int 是两种类型
#include <iostream>
using namespace std;
// 函数重载的注意事项
// 1. 引用作为重载参数
void add(int &a) {
cout << "调用非 const" << endl;
}
void add(const int &a) {
cout << "调用 const" << endl;
}
int main() {
// int 和 const int 是两种类型
int a = 10;
const int b = 10;
// 调用的是非 const
add(a);
// 调用的是 const
add(10);
add(b);
return 0;
}
- 函数重载碰到默认参数
#include <iostream>
using namespace std;
void add(int a, int b = 10) {
cout << "调用1" << endl;
}
void add(int a) {
cout << "调用2" << endl;
}
int main() {
add(1); // 此时不能确定是调用 1 还是 2,所以判断函数是否重载,需要将默认参数排除在外
return 0;
}