第五章函数
- 一个C+++程序由一个或多个源程序文件组成
- 一个源程序文件由一个或多个函数组成
- C++程序的执行从main函数开始
- 调用其他函数后流程回到main函数
- 再main函数中结束整个程序运行
函数的定义与声明
-
函数的定义:
-
形式参数表name1,name2,namen
-
每个形参必须同时给出形参的类型和名称 eg:int max(int a,b)是错误的
-
C++中函数的声明原则:
-
函数定义在先,调用在后,调用前不必声明
-
函数定义在后,调用在前,调用前必须声明
-
函数的说明:
-
<类型><函数名>(<参数表>); int max(int x,int y);
函数体
- 由{}括起来的语句序列构成,是实现函数功能的主体
- 函数体中使用return语句返回函数执行结果 语句格式: return 表达式;//其中表达式类型应与函数返回值类型一致
- 对于无返回值的函数,可以省略return
- 程序设计时有时为使逻辑结构清楚,将主函数main放在程序开头,而将函数声明放在主函数main之前
函数定义与函数声明的区别
函数定义
- 指函数功能的确立
- 指定函数名、函数类型、形参及类型、函数体等
- 是完整独立的单位
函数声明
- 是对函数名、返回值类型、形参类型的说明
- 不包括函数体
- 是一条语句,以分号结束,只起一个声明作用
函数的调用
- 函数定义后,并不能自动执行,必须通过函数调用来实现函数的功能
- 函数调用,即控制执行某个函数
- C++中,主函数可以调用其他子函数,而其他函数之间也可以互相调用
调用格式
- 一般格式:<函数名>(<实际参数表>)//有参调用 或 <函数名>()//无参调用
- <函数名>为要使用的函数的名字
- <实际参数表>是以逗号分隔的实参列表,必须放在一对圆括号中。<实参表>与<形参表>中参数的个数、类型和次序应保持一致
- 当调用无参函数时,函数名后的圆括号不能省略
- 形参为简单类型变量,对应的实参可以是:常量,变量及表达式
- 函数调用出现在表达式中
- 函数调用过程是:
- 为形参及函数体中的变量分配存储空间;
- 用实参向形参传递数据;
- 终端现行函数,将控制转交给被调用函数执行
- 函数调用的返回过程是:
- 先计算出返回语句中<表达式>的值
- 若表达式值的类型与函数类型不一致,则强制转换
- 将计算出的表达式值返回给调用函数作为返回值
- 将控制由被调用函数转向为调用函数,执行后面语句
嵌套调用
- 函数的嵌套调用是指在执行被调用函数时,被调用函数又调用了其他函数
递归调用
- 函数调用过程中出现直接或间接调用该函数本身的情况,称为函数的递归调用
参数传递方式
- 值传递:调用函数中的数据只是在调用之初通过实参向形参传递,之后各占有不同的空间,并且不再发生联系,互不干扰
- 特点是:形参值的改变不影响实参
- 实参本身的值在调用前后和调用过程中都不发生变化
- 引用传递:引用(&)是标识符的别名
带默认形参的函数
- 默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数(因为调用时实参取代形参是从左到右的顺序)
- 在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参
内联函数
变量的作用域和存储类型
- 标识符的作用域:
- 作用域规则:标识符只在声明它或定义它的范围内可见,在此范围外不可见。
- 变量的分类:
- 局部变量:
- 全局变量:
变量的存储类型
- auto型(自动变量)
- static型(静态变量)
- extern型(外部变量)
- register型(寄存器变量)
内部函数和外部函数
系统函数和预处理命令
- 文件包含命令#include
- 宏定义命令#define