一、函数的默认参数
简要说明
- 在C++中,函数形参列表中的形参是可以有默认值的
- 语法:返回类型 函数名 (形参 = 默认值){}
注意事项
1. 如果某个位置参数有默认值,那么从这参数往后,从左往右,都要有默认值
代码示例:
#include <iostream>
using namespace std;
int func(int a, int b = 10, int c = 20)
{
return a + b + c;
}
int main()
{
int ret;
ret = func(10);
cout << "ret = " << ret << endl;
system("pause");
return 0;
}
运行结果如下:
错误代码示例:
int func(int a, int b = 10, int c) //c没有默认值,是错误的写法
{
return a + b + c;
}
2. 如果函数声明有默认参数,那么函数实现就不能有默认参数
代码示例:
#include <iostream>
using namespace std;
int func(int a, int b = 20, int c = 10); //函数的声明
int main()
{
cout << "func(10) = " << func(10) << endl;
system("pause");
return 0;
}
int func(int a, int b, int c) //函数的实现
{
return a + b + c;
}
运行结果如下:
错误代码示例:
#include <iostream>
using namespace std;
int func(int a, int b = 10, int c = 20); //函数的声明
int main()
{
int ret;
ret = func(10);
cout << "ret = " << ret << endl;
system("pause");
return 0;
}
int func(int a, int b = 10, int c = 10) //函数的实现
{
return a + b + c;
}
如图所示,就算函数声明和函数实现处的默认值一样,生成时也会出错,所以,只需在函数声明处设置默认值即可。
3. 如果我们自己传入数据,编译器就用我们传入的数据,如果没有,就用默认值
代码示例:
#include <iostream>
using namespace std;
int func(int a, int b = 20, int c = 10); //函数的声明
int main()
{
cout << "func(10,30) = " << func(10,30) << endl;
system("pause");
return 0;
}
int func(int a, int b, int c) //函数的实现
{
return a + b + c;
}
运行结果如下:
10 + 30 + 10 = 50; 由运行结果可知编译器用的是我们传入的值。所以,如果我们自己传入数据,编译器就用我们传入的数据,如果没有,就用默认值
二、函数占位参数
简要说明
- C++中,函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置
- 语法: 返回值类型 函数名 (数据类型){}
代码如下(示例):
#include <iostream>
using namespace std;
void func(int a, int) //第二个int为占位参数
{
cout << "This is func." << endl;
}
int main()
{
func(10,10); //占位参数必须填补
system("pause");
return 0;
}
- 占位参数也可以有默认参数
代码如下(示例):
#include <iostream>
using namespace std;
void func(int a, int = 10) //第二个int为占位参数
{
cout << "This is func." << endl;
}
int main()
{
func(10); //此时占位参数就不用填补了,因为她已经有默认值了
system("pause");
return 0;
}
现阶段看起来占位参数意义不大,后续会用到该项技术的。
三、函数重载
基本语法
作用:函数名可以相同,提高复用性
函数重载满足条件:
- 同一个作用域下
- 函数名称相同
- 函数 参数类型不同 或者 个数不同 或者 顺序不同
注意: 函数的返回值不可以作为函数重载的条件
注意事项
1. 引用作为重载的条件
代码如下(示例):
#include <iostream>
using namespace std;
void func(int& a) //int &a = 10;不合法 详见引用篇
{
cout << "func(int& a)的调用" << endl;
}
void func(const int& a) //const int &a = 10;合法
{
cout << "fund(const int& a)的调用" << endl;
}
int main()
{
func(10);
system("pause");
return 0;
}
运行结果如下:
或者:
代码如下(示例):
#include <iostream>
using namespace std;
void func(int& a) //int &a = a;合法 详见引用篇
{
cout << "func(int& a)的调用" << endl;
}
void func(const int& a)
{
cout << "fund(const int& a)的调用" << endl;
}
int main()
{
int x = 10;
func(x);
system("pause");
return 0;
}
运行结果如下:
2. 函数重载碰到默认参数
代码如下(示例):
#include <iostream>
using namespace std;
void func(int a, int b = 10)
{
cout << "func(int a,int b)的调用" << endl;
}
void func(int a)
{
cout << "func(int a)的调用" << endl;
}
int main()
{
func(10); //碰到默认参数会产生歧义,需要避免
system("pause");
return 0;
}
由此可见,函数重载要注意避免默认参数,以免产生歧义。
总结
提示:本节内容主要为函数提高