第3章 函数
3.1 函数的定义和使用
函数的定义
//格式
类型说明符 函数名(含类型说明符的形参列表){
语句序列;
}
① 类型说明符可以是C++除数组以外的内置数据类型或自定义类型,没有返回值时写为void
② 当函数的返回值不是void,表明函数有返回值,如果函数体内没有return语句,此时函数返回的值是与返回类型相同但内容却是随机的一个值。
③ 函数头简称接口,编写函数体是为了实现函数的功能,即函数定义简称实现。
函数的参数
形参:函数定义中的形式参数列表
- ① 函数定义时指的是形参,在未进行函数调用前,并不实际占用内存中的存储单元。
- ② 只有在发生函数调用时,形参才分配实际的内存单元,接受从主调函数传来的数据。
- ③ 当函数调用结束后,形参占用的内存单元被自动释放。
实参:函数调用时提供给被调函数的参数
- ① 实参的类型、次序、数目要与形参一致
- ② 参数类型不一致,函数调用时按形参类型隐式类型转换实参。
- ③ 参数次序不一致(数据不合逻辑)
- ④ 参数数目不一致(编译错误)
两种函数传递机制:
- 值传递: 形参作为被调函数的内部变量来处理,开辟内存空间以存放主调函数实参值的副本。
- 引用传递: 引用类型的形参通过形实结合,成为实参的一个别名,对形参的操作直接作用于实参。
函数
3.2 内联函数
内联函数:在调用时不发生控制转移,而是在编译时将函数体嵌入在每一个调用处,节省了参数传递、控制转移等开销。
inline 类型说明符 函数名(含类型说明符的形参列表){
语句序列
}
① 内联函数仅适用于功能简单、规模较小的又使用频繁的函数
② 内联函数中不允许用循环语句和switch语句
③ 内联函数的声明必须出现在内联函数第一次调用之前。
3.3 带默认形参值的函数
C++在函数定义或声明时,为形参指定默认值,这样的参数称为默认参数,如果没有给出实参,则采用默认形参值。
//函数声明
int add(int a=5,b=6);
//函数定义
int add(int a /*=5*/,int b /*=6*/){
return a+b;
}
① 如果在函数定义时设置了默认参数,那么就不能在函数声明中再次设置,反之亦然。
② 可以有多个默认参数,设置顺序为自右向左。
3.4 函数重载
函数重载:两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
3.5 函数模板
template <模板形参列表>返回类型 函数名(形参列表){
语句序列;
}
模板形参列表是一对尖括号<>括起来的一个或多个模板形参的列表,不允许为空,形参之间用逗号分隔。
//形参表写法1
typename 类型参数名1,typename 类型参数名2.....
//形参表写法2
class 类型参数名1,class 类型参数名2.....