提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
C++基础(六)——函数调用
1 函数分类
(1)系统函数
由编译系统提供的函数。
(2)无参函数
调用函数时无需给定参数。
(3)有参函数
在调用函数时,要给穿参数
2 定义函数形式
类型名 函数名()
{声明部分
执行语句
}
3 函数参数和函数的值
3.1 形式参数和实际参数
在定义函数时,函数名后面括号中的变量名称为形式参数。
在主函数中调用一个函数时,函数名后面括号中的参数称为实际参数。
3.2函数的返回值
通过函数的调用使主函数能够得到一个确定的函数值,这就是函数的返回值。
函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。如果需要从被调函数带回函数值,被调函数中必须包含return语句。如果不需要从被调函数带回函数值,则不需要。
4 函数的调用
函数调用的一般形式:函数名([实参列表])。
4.1函数调用的方式
(1)函数语句
把函数调用单独作为一个语句,并不要求函数带回一个值,只求函数完成一定的操作。
prinstar();
(2)函数表达式
函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如,
c = 2+max(a,b);
(3)函数参数
函数调用可以作为一个函数的实参。如,
m = max(a,max(b,c));
4.2 对被调用的函数的声明和函数原型
在函数中调用另一个函数:
(1)被调用的函数必须是已存在的函数。
(2)使用库函数需要在本文件开头用#include命令将有关头文件包含到本文件中来。
(3)用户自定义的函数与调用它的函数在同一程序单位,且位于主函数之后,在调用此函数之前对被调用的函数作声明。
函数的定义和声明不是同一回事。函数定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数声明则是把函数的名字、函数类型以及形参的个数、类型和顺序通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参和形参的个数和类型是否一致)。
#include <iostream>
using namespace std;
int main(){
float add(float x,float y); //对add函数作声明
float a,b,c;
cin >>a>>b;
c = add(a,b);
cout <<"sum="<<c<<endl;
return 0;
}
float add(float x,float y){ //定义add函数
float z;
z = x+y;
return z;
}
注意:
(1)被调用函数的定义出现在主调函数之前,可以不必加以声明。
(2)函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。如果函数声明放在函数外部,在所有函数定义之前,则在各个主调函数中不必对所调用的函数再做声明。
5 函数的递归调用
在调用一个函数的过程中,出现直接或间接地调用该函数本身,称为函数的递归调用。
6 *内置函数
调用函数需要一定的时间和空间开销。如果有的函数需要频繁使用,则所用的时间会很长,从而降低程序的执行效率。C++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,这种方法称为内置函数。一般将规模很小(5个语句以下)而使用频繁的函数声明为内置函数。
将函数指定为内置函数:
#include <iostream>
using namespace std;
inline int max(int,int,int); //声明内置函数,注意左端有inline
int main ()
{
int i = 10,j = 20,K = 30,m;
m = max(i,j,k);
cout<<"max="<<m<<endl;
return 0;
}
inline int max(int a,int b,int c) //定义内置函数max
{
if (b>a) a=b;
if (c>a) a=c;
return a;
}
7 局部变量和全局变量
在一个函数内部定义的变量,它只在本函数的范围内有效,也就是说只有在定义的函数内才能使用它们,同样,在复合语句中定义的变量只能在在复合语句的范围内有效。这些内部变量称为局部变量。
在函数内定义的变量是局部变量,而在函数之外定义的变量是外部变量,称为全局变量。全局变量的有效范围从定义变量的位置开始到本源文件结束。
8 变量的存储类别
8.1 动态存储与静态存储
存储期(也称为生命期),是变量的一种属性。存储期可以分为静态存储期和动态存储期,程序中所用的数据分别存放在静态存储区和动态存储区。全局变量存放在静态存储区中,在程序开始时给全局变量分配存储单元,程序执行完毕就释放这些空间。在程序执行过程中他们占据固定的存储单元,而不是动态的进行分配和释放。
在动态存储区中存放以下数据:(1)函数形式参数。(2)函数中定义的变量(未加static声明的局部变量)。(3)函数调用时的现场保护和返回地址等。对这些数据函数调用开始时分配动态存储空间,函数调用结束时释放这些空间。
8.2 自动变量
函数的局部变量,如果不用关键字static加以声明,编译系统对他们是动态的分配存储空间。在函数调用就自动释放这些空间,这类局部变量称为自动变量。
8.3 用static声明静态局部变量
如果希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用存储单元不释放,可以用static声明静态局部变量。
9 内部函数和外部函数
9.1 内部函数
**如果一个函数只能被本文件中其他函数所调用,它称为内部函数。**在定义内部函数时,在函数名和函数类型的前面加static,例如`static int func(int a,int b)。
9.2 外部函数
**如果一个函数可以被其他文件所调用,它称为外部函数。**在定义外部函数时,在函数名和函数类型的前面加extern,例如extern int func(int a,int b)
。如果省略extern,则默认为外部函数。