函数
在介绍函数前,先介绍几个关于函数的问题:
1、什么是函数?
函数是程序代码的一个自包含单元,用于完成某一特 定的任务。
有的函数完成某一操作, 有的函数计算出一个值。
通常,一个函数即能完成某一特定操作,又能计算数值。
2、为什么要定义函数?
避免重复的编程,使程序更加模块化,便于阅读、修改。
3、注意事项
一个程序必须有且只有一个main( )函数,C++从main( ) 函数开始执行。
C++语言中,所有函数都是平行独立的,无主次、相 互包含之分。函数可以嵌套调用,不可嵌套定义。
函数调用示意图:
函数分类
从用户使用的角度看,函数有两种:
(1) 系统函数,即库函数(标准函数)。
(2) 用户自己定义的函数。
从函数的形式看,函数分两类:
(1) 无参函数。调用函数时不必给出参数。
(2) 有参函数。在调用函数时,要给出参数。在主调函数 和被调用函数之间有数据传递。
关于库函数
•数学计算函数(如sqrt()、pow(),fabs(),exp()等, cmath)
•字符串处理函数(string)
•标准输入输出函数等(iostream)
•用户使用任一库函数时,直接使用,不用定义,但在程序 中必须包含相应的头文件。 (如 #include等)
一般形式
类型标识符 函数名(形式参数表列) {声明部分 语句 }
int max(int x,int y)
{int z;
z=x>y?x:y;
return (z);
}
注:C++要求在定义函数时必须指定函数的类型。
形参与实参
1、形参
在定义函数时函数名后面括号中的变量名称为 形式参数(formal parameter,简称形参)。 形参是被调函数中的变量
注:在函数调用前,形参并不占内存的存储单元,只有在函 数开始调用时,形参才被分配内存单元。调用结束后,形 参所占用的内存单元被释放。
2、实参
在主调函数中调用一个函数时,函数名后面括 号中的参数(可以是一个表达式)称为实际参数 (actual parameter,简称实参)。 实参是主调函数赋给被调函数的特定值。 实参可以是常量、变量或复杂的表达式,不管是哪 种情况,在调用时实参必须是一个确定的值。
实参可以是常量、变量或表达式,但要求有确定的值。
注:
实参变量对形参变量的数据传递是"值传递",即单向传 递,只由实参传给形参,而不能由形参传回来给实参。在 内存中实参、形参分占不同的单元。
实参与形参一一对应,类型应相同或赋值兼容。
不同的函数中可以使用相同的变量名和形参名,他们是 不同的变量。
返回值
1、函数的返回值通过return语句获得。
2、函数只能有唯一的 返回值。
3、 函数返回值的类型就是函数的类型。
4、 return语句可以是一个表达式,函数先计算表达式后再返 回值。
5、 return语句还可以终止函数,并将控制返回到主调函数。
6、return 语句之后的代码是不能执行的代码。
7、 一个函数中可以有一个以上的return语句,执行到哪一 个return语句,哪一个语句起作用。
8、函数有返回值,这个值当然应属于某一个确定的类型, 应当在定义函数时指定函数值的类型。
9、不带返回值的函数可说明为void型。
10、、函数的类型与函数参数的类型没有关系。
double blink ( int a, int b)
11、、如果函数的类型和return表达式中的类型不一致,则以 函数的类型为准,函数的类型决定返回值的类型。对 数 值 型数据,可以自动进行类型转换。
函数的调用
一般形式
函数名([实参表列])
调用方式:
1. 函数语句
把函数调用单独作为一个语句,并不要求函数带回一个值, 只是要求函数完成一定的操作。如printstar();
2. 函数表达式
函数出现在一个表达式中,这时要求函数带回一个确定的 值以参加表达式的运算。如c=2max(a,b);
3. 函数参数
函数调用作为一个函数的实参。如 m=max(a,max(b,c)); 函数出现在一个表达式中,这时要求函数带回一个确定的 值以参加表达式的运算。如c=2max(a,b);
条件:
(1) 首先被调用的函数必须是已经存在的函数。
‘(2) 如果使用库函数,应用#include命令将有关头文件 "包含"到本文件中来。
(3) 如果使用用户自定义的函数,函数调用遵循先定义、 后调用的原则,即 被调函数应出现在主调函数之前; 如果被调用函数出现在主调函数之后,则函数必须在主调函数 之前进行声明。
函数声明的一般形式(又称为函数原型):
函数类型 函数名(参数类型1,参数类型2…)
函数类型 函数名(参数类型1 参数名1,参数类型2 参数 名2…)
函数嵌套定义
C语言中,所有函数都是平行独立的,无主次、相互包含之分。 函数可以嵌套调用,不可嵌套定义。
过程
递归
定义:在调用一个函数的过程中又出现直接或间接地调 用该函数本身,称为函数的递归(recursive)调用。
⑴ 递归边界条件:
确定递归到何时终止,也称为递归出口;
或者说,直接有解的情况
⑵ 递归模式:
大问题是如何分解为小问题的,也称为递 归体。
全局变量与局部变量
在函数内定义的变量是局部变
在函数之外定义的变量是外部变量,称为全局变 量
全局变量的有效范围为从定义变量的位置 开始到本源文件结束。
注:
(1) 设全局变量的作用是增加函数间数据联系的渠道。
(2) 建议不在必要时不要使用全局变量,
因为:
① 全局变量在程序的全部执行过程中都占用存储单元,而 不是仅在需要时才开辟单元。
② 它使函数的通用性降低了
③ 使用全局变量过多,会降低程序的清晰性。
(3) 如果在同一个源文件中,全局变量与局部变量同名 ,则在局部变量的作用范围内,全局变量被屏蔽, 即它不起作用。
变量作用域分为5类
文件作用域
全局变量
函数作用域
局部变量
块作用域
局部变量
函数原型作用域 ,作用域从变量起作用的范围对变量进行了讨论, 即变量生存的空间
存储类别
存储类别是从生存时间的角度来分析的,指的是数据 在内存中存储的方法,分为动态存储变量和静态存储变 量。
具体包含4种: 1、自动的 2、静态的 3、寄存器的 4、外部的。
预处理
C++提供的预处理功能主要有以下3种: (1) 宏定义 (2) 文件包含 (3) 条件编译
为了与一般C++语句相区别,这些命令以 符号"#"开头,而且末尾不包含分号。
头文件
头文件一般包含以下几类内容:
(1) 对类型的声明。
(2) 函数声明。
(3) 内置(inline)函数的定义。
(4) 宏定义。用#define定义的符号常量和用const声明 的常变量。
(5) 全局变量定义。
(6) 外部变量声明。
(7) 还可以根据需要包含其他头文件。