主要介绍函数的默认参数用法,占位参数的用法,函数重载的相关语法和相关注意事项。
在C++中,定义函数时可以给形参指定一个默认的值,这样调用函数时如果没有给这个形参赋值(没有对应的实参),那么就使用这个默认的值。也就是说,调用函数时可以省略有默认值的参数。如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。
所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个值,这个值就是给形参指定的默认值。
返回值类型 函数名 (参数 = 默认值){ }
#include
using namespace std;
void func(int n, float b = 1.2, char c = '@')
{
cout << n << ", " << b << ", " << c << endl;
}
int main()
{
//为所有参数传值
func(10, 3.5, '#');
//为n、b传值,相当于调用func(20, 9.8, '@')
func(20, 9.8);
//只为n传值,相当于调用func(30, 1.2, '@')
func(30);
system("pause");
return 0;
}
如果某个位置参数有默认值,那么从这个位置往后,从左到右,必修都要有默认值
如果函数声明有默认值,函数实现的时候就不能有默认值,简单地说:函数声明与函数的实现只能有一个拥有默认值。
正确的写法:
void func(int a, int b=10, int c=20){ }
void func(int a, int b, int c=20){ }
错误的写法:
void func(int a, int b=10, int c=20, int d){ }
void func(int a, int b=10, int c, int d=20){ }
c++在声明函数时,可以设置占位参数。占位参数只有参数类型声明,而没有参数名声明。一般情况下,在函数体内部无法使用占位参数。
返回值类型 函数名 (数据类型){ }
void TestFunc01(int a,int b,int){
//函数内部无法使用占位参数
cout << "a + b = " << a + b << endl;
}
//占位参数也可以设置默认值
void TestFunc02(int a, int b, int = 20){
//函数内部依旧无法使用占位参数
cout << "a + b = " << a + b << endl;
}
int main(){
//错误调用,占位参数也是参数,必须传参数
//TestFunc01(10,20);
//正确调用
TestFunc01(10,20,30);
//正确调用
TestFunc02(10,20);
//正确调用
TestFunc02(10, 20, 30);
return EXIT_SUCCESS;
}
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。 这就是重载函数。 重载函数常用来实现功能类似而所处理的数据类型不同的问题。 不能只有函数返回值类型不同。
函数名可以相同,提高复用性
同一个作用域下
函数名称相同
函数参数类型不同或者个数不同或者顺序不同
void func()
{
cout << "func的调用" << endl;
}
void func(int a)
{
cout << "func(int a)的调用!" << endl;
}
void func(double a)
{
cout << "func(int a)的调用!" << endl;
}
void func(int a, double b)
{
cout << "func" << endl;
}
void func( double b,int a)
{
cout << "func" << endl;
}
int main()
{
//func(10);
//func();
//func(3.14);
//func(10, 3.14);
//func(3.14, 10);
system("pause");
return 0;
}
注意:函数的返回值不可以作为函数重载的条件。
//函数重载的注意事项:
//1.引用作为重载的条件
void func(int& a)
{
cout << "func(int &a)" << endl;
}
void func(const int& a)
{
cout << "func(int &a)" << endl;
}
//以上一组代码的传入参数类型不同
//2.函数重载遇到默认参数
void func2(int a)
{
cout << "func2(int a)" << endl;
}
void func2(int a,int b = 10)
{
cout << "func2(int a,int b = 10)" << endl;
}
int main()
{
int a = 10;
//func(a);//因为a是变量,所以不传入带有const的那组函数
//func(10);//因为10为常量,所以传入带有const的那组函数,如果走无const那组函数就不合法,因为是int &a = 10;然而const int &a = 10;是合法的
//func2(10);//当函数重载遇到默认参数,出现二义性,报错,尽量避免这种情况
}