第三章 函数
希望在定义一个函数前调用它,则需要在调用函数之前添加该函数的函数原型声明,形式如下:
类型说明符 函数名(含类型说明的形参表);
形参表可以省略形参名
当发生函数调用时,给形参分配内存空间,并用实参来初始化形参。
这一传递过程是单向的,此后形参发生的改变不会影响到实参。
用引用作为形参,在函数调用时发生的参数传递称为引用传递
引用: 引用是一种特殊类型的变量,可以被认为是另一个变量的别名
- 声明一个引用时必须同时对它进行初始化,使它指向一个已经存在的对象
- 一旦一个引用被初始化后就不能改为指向其他对象
引用传递将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参,这样形参就成为实参的一个别名,对形参的任何操作都直接作用于实参。
对于一些功能简单、规模又小且使用频繁的函数可以设计为内联函数;
内联函数在调用时不发生控制转移,而是在编译时将函数体嵌入在每一个调用处。
inline 类型说明符 函数名(含类型说明的形参表){
语句序列
}
注: inline关键字只是表示一个要求,编译器会综合考虑再决定将哪个函数作为内联。
- 内联函数体内不能有循环语句和switch语句
- 内联函数的定义必须出现在内联函数第一次被调用之前
- 对内联函数不能进行异常接口声明
- 有默认值的形参右面,不能出现无默认值的形参
- 如果函数再定义之前有原型声明,那么默认形参值需要在原型声明中给出,定义中不能再出现默认形参值
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
- 形参的个数不同或者类型不同
- 不同功能的函数不应该定义为重载函数
- 后进先出LIFO
- 一组嵌套的函数调用中,越早开始的调用返回的越晚
- 函数的形参和局部变量,可以用栈来存储,这种栈称作运行栈
- 运行栈中有一个一个栈帧,每一个对应一次函数调用
- 当函数发生递归调用时,同一个局部变量在不同递归深度上可以同时存在不同的取值,这在底层是如何做到的?
对同一个函数的多次不同调用中,编译器会为函数的形参和局部变量分配不同的空间,他们互不影响。