函数
函数的默认参数
可以为形参提供默认值。
int add(int a, int b = 1, int c = 2) {
return a + b + c;
}
int main()
{
cout << (add(1, 3, 4)) << endl;//8
cout << (add(1, 3)) << endl;//6
cout << (add(1)) << endl;//4
return 0;
}
注意:
- 默认参数后面的形参,也必须提供默认参数。
- 如果函数声明有默认参数,那么函数实现就不能有默认参数。
声明、实现只能有一处有默认参数,不能都有否则会有歧义。
声明时有默认参数:
int add(int a, int b = 1, int c = 2);
int add(int a, int b, int c) {
return a + b + c;
}
实现时有默认参数:
int add(int a, int b, int c);
int add(int a, int b = 1, int c = 2) {
return a + b + c;
}
函数占位参数
形参列表里可以有占位参数,用来占位,调用时必须提供对应的值来填补该位置。
下面代码中形参列表中第三个int是用来占位的。调用时必须传递一个int值。
int add(int a, int b, int){
return a + b;
}
int main()
{
cout << (add(1, 3, 4)) << endl;//8
return 0;
}
占位还可以有默认值,调用的时候就不用传参了:
int add(int a, int b, int = 100){
return a + b;
}
int main()
{
cout << (add(1, 3)) << endl;//8
return 0;
}
函数重载
作用:函数名可以相同,提高复用性。
函数重载需要满足的条件:
- 同一个作用域下
- 函数名相同
- 形参类型、个数、顺序等至少有一处不同(否则无法区分两个函数了)
函数重载注意事项:
- 引用作为重载的条件时
- 值传递和引用传递可能会产生歧义(定义没问题,但调用时报错):
void func(int& a) {
cout << "int & a" << endl;
}
void func(int a) {
cout << "int a" << endl;
}
- 引用传递和引用常量之间不会产生歧义:
void func(int& a) {
cout << "int & a" << endl;
}
void func(const int& a) {
cout << "const int& a" << endl;
}
int main()
{
int a = 9;
func(a);//"int & a"
func(10);//"const int& a"
return 0;
}
- 值传递和引用常量之间会产生歧义(调用时报错):
void func(int a) {
cout << "int a" << endl;
}
void func(const int& a) {
cout << "const int& a" << endl;
}
- 函数重载碰到函数默认参数时可能会产生歧义。