第3章 函数

108 阅读3分钟

第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.....