函数进阶

默认参数

为了简化传参,函数允许定义默认参数

注意:

  1. 非默认参数必须在所有默认参数之前
  2. 如果函数声明有默认参数,则函数定义不可以有默认参数。
1
2
3
4
5
6
7
8
9
10
int add(int a, int b = 20, int c = 30)
{
return a + b + c;
}
// res = 10 + 20 + 30 = 60
res = add(10);
// res = 10 + 10 + 30 = 50
res = add (10, 10);
// res = 10 + 10 + 10 = 30
res = add (10, 10, 10);

占位参数

语法:返回值类型 函数名 (数据类型){}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//占位参数
void func(int a, int)
{
cout<<a<<endl;
}
//使用
func(10, 10);

// 占位参数可以有默认参数
void func(int a, int = 10)
{
//code
}
func(10);

函数重载

允许出现同一个函数名

条件

  • 同一个作用域
  • 函数的函数名相同
  • 函数的参数列表类型、顺序、个数有差异
  • 函数的返回值不同不能作为重载的条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 函数重载

//override(int)
void override(int a)
{
cout<<"override1";
}
//override(int,long)
void override(int a, long b)
{
cout<<"override2";
}
//override(long,int)
void override(long a,int b)
{
cout<<"override3";
}
// 只修改返回值不可以作为重载条件
// => override(long, int) 与上函数相同,不可以重载
int override(long a, int b)
{
cout<<"override1";
}

事项

引用作为重载条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 如下形式可以重载,但是要注意调用的形式

// ref(int&)
void ref(int &a)
{
//code
}
//调用
int a = 10;
ref(a);

// ref(const int&)
void ref(const int &a)
{
//code
}
ref(10);

函数重载遇到默认参数

1
2
3
4
5
6
7
8
9
10
11
//带有默认参数的时候进行函数重载可能会出现二义性。
// 因此尽量不要在函数重载的时候同时使用默认参数
void def(int a, int b = 10)
{
//code
}

void def(int a)
{
//code
}