C++中可利用函数将一段在代码中需要多次重复或特定功能的内容封装起来,减少代码重复。
较大的程序,一般分为若干程序块,每个程序块实现特定功能。
1. 函数定义和声明
函数定义时括号内的是形式参数,简称形参,函数调用时传入的参数为实际参数,简称实参。
- 值传递就是函数调用的时候,实参将数值传给形参,但形参发生改变,不会影响实参
- 函数声明可以多次,但函数定义只能有一个
- 函数常见样式有 有参有返,有参无返,无参有返,无参无返四种类型
//函数定义
//返回值类型 函数名(形式参数列表)
//{
// 函数体
// 返回值不为空,要有return语句
//}
int add(int a, int b); //函数声明
int add(int a, int b) //函数定义,有参有返
{
return a+b;
}
int main()
{
int a = 10;
int b = 20;
int sum = add(a,b); //函数调用
return 0;
}
1.1 函数的默认参数
函数形参列表中的形参可以有默认值,若带默认值的形参没有对应的实参传入数据,则使用默认值。
- 若某个形参有默认值,则该形参右边的参数都必须有默认值(即带默认值参数放最右边)
- 函数声明和函数定义中,形参默认值只需要在二者之一中出现
//返回值类型 函数名(形参=默认值){}
int AddTriple(int a, int b=2, int c = 3); //声明中写了默认值
int AddTriple(int a, int b, int c) //定义时不再写参数默认值
{
return a+b+c;
}
1.2 函数占位参数
占位参数只有参数类型声明,没有参数名声明,但可以有默认值。
int Add(int a, int b, int=0) //带默认值的占位参数
{
return a+b;
}
int main()
{
int x = 1;
int y = 2;
int z = 4;
int sum = Add(x,y); //占位参数可方便函数扩展
int sum1 = Add(x,y,z);
}
2. 函数的分文件编写
为让代码结构更清晰,在较多代码时往往需要需要分文件编写函数。函数分文件编写一般4个步骤:
- 分别创建后缀为.cpp和.h的源文件和头文件
- 在头文件中写函数声明
- 在源文件中写函数定义,并include相应头文件
注意:自定义的头文件在include时用双引号
// add.h
int add(int a, int b);
//add.cpp
#include "add.h"
int add(int a, int b)
{
return a+b;
}
3. 函数重载
函数名和返回值类型相同,函数参数不同,提高函数的复用性。
函数重载需要满足:
- 同一个作用域下
- 函数名和返回值类型相同
- 函数参数的类型/顺序/数目 不同
int add(int a, int b) //V0
{
retutn a+b;
}
int add(double a, double b) //V1, 参数类型不同
{
retutn a+b;
}
int add(int a, int b, int c) //V2, 参数数目不同
{
retutn a+b+c;
}
// main()
int x=1,y=2,z=3;
double m=1.2, n=2.1;
int sum0 = add(x,y); //调用V0
int sum1 = add(m,n); //调用V1
int sum2 = add(x,y,z); //调用V2
3.1 引用作为重载条件
void func(int &a) // V0
{
cout<<"func(int &a)"<<end;
}
void func(const int &a) //V1, V0和V1满足重载条件
{
cout<<"func(const int &a)"<<end;
}
// main()
int a=10;
func(a); //调用V0, int &a=10;
func(10); //调用V1, const int &a=10;
3.2 重载 & 默认参数
需要避免出现调用时的二义性
int add(int a, int b) //V0
{
retutn a+b;
}
int add(int a, int b, int c=2) //V1,带默认参数
{
retutn a+b+c;
}
// main()
int x=1,y=2;
int sum = add(x,y); //此时add V0和V1都满足调用条件,出现二义性,报错
参考:
黑马程序员C++系列