文档介绍:第四章函数
函数是C++程序的基本模块。通常我们将一些功能相对独立的或经常使用的操作或运算抽象出来,定义为函数,这些函数可以被重复使用,使用时只要考虑其功能和使用接口即可。在结构化程序设计中,函数是将任务进行模块划分的基本单位,这些模块可以分别单独设计调试并协作完成整个任务。而在面向对象的程序设计中,类中所封装的操作也是用函数进行描述的,因此函数在C++程序中具有非常重要的意义。要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量的生命期和作用域。作为面向对象的设计语言,本章还将介绍关于函数重载的概念,此外,还将介绍递归算法、内联函数、默认参数函数以及多文件组织、编译预处理、工程文件的概念和运行库函数。
函数的定义与调用
函数概述
在编写较大的程序时,由于任务相对复杂,程序篇幅大,给设计、调试、阅读都将带来困难。如果能将任务合理划分,对功能相对简单的子任务进行单独设计调试,又通过某种机制将这些子任务连接成完整的程序,就能大大提高程序设计效率。函数便体现了这样的设计思想。
main()
fun2()
fun3()
fun1()
fun2_1()
fun2_2()
fun1_1()
函数调用层次关系
任何一个C++程序都是由若干个函数组成的,其中有一个函数称为主函数,它是程序执行的入口函数,VC++的控制台编程由用户定义为main()函数,而Windows编程(MFC)则由编译系统定义为WinMain()。一般一个函数既可以调用其他函数,也可以被其他函数调用,但主函数只能调用其他函数,而不能被调用。。
函数按其是否系统预定义分为两类,一类是编译系统预定义的,称为库函数或标准函数,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。这些库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。另一类是用户自定义函数,用户可以根据需要将某个具有相对独立功能的程序定义为函数。
函数按是否带有参数分为有参函数和无参函数。如前面介绍的exit( )函数,使用时必带有一个参数,称为有参函数;而abort( )函数则不带参数,称为无参函数。
函数的定义
一个函数包括函数头和函数体两部分。函数头定义函数名、参数、函数返回值类型等内容,函数体则定义函数的算法实现。对于用户自定义函数,必须先定义后使用。下面分别介绍无参函数和有参函数的定义格式。
1 无参函数
定义格式为:
《数据类型》函数名(《void》) { 函数体}
其中数据类型指函数返回值类型,可以是任一种标准的或已定义的数据类型。缺省为返回整型值。有些函数实际上只是为了完成某个操作而不是为了求一个值,则应将返回值类型定义为void,表示没有返回值。函数名只能用合法标识符表示,不能用常量或表达式。无参函数参数括号中的void通常也可以缺省,但括号不能省略。函数体由一系列语句组成。函数体可以为空,称为空函数。空函数一般不具有实际意义,但在某些特殊场合有用,如纯虚函数不定义函数体。关于纯虚函数将在面向对象设计中介绍。请看一个无参函数的例子:
void TableHead ( ) {
cout<<″****************″<<endl;
cout<<″* example *″<<endl;
cout<<″****************″<<endl;
}
该函数的功能是打印一个表头。
2 有参函数
有参函数的定义格式为:
《数据类型》函数名(参数类型1 形式参数1《,参数类型2 形式参数2,…》){<函数体>}
有参函数和无参函数定义的区别仅在于参数表部分。有参函数的参数表中列出所有形式参数的类型及参数名称。参数类型可以是任一种标准类型或已定义类型,各参数之间即使类型相同也必须分别加以说明。形式参数简称形参,只能是变量名,不允许常量或表达式。请看以下有参函数的例子:
max (int a, int b){
return(a>=b?a:b);
}
该函数的功能是返回两个整数中较大一个的值。
根据参数和返回值请况,函数可有以下四种形式:
(1)获取参数并返回值。如上例。
(2)获取参数但不返回值。例如:
void delay(long n){
for (int i=0;i<n;i++); //延时一段时间
}
(3)不获取参数但返回值。例如:
int input ( ){ //输入满足要求的数据
int n;
cout<<″输入一个大于5的整数:″<<endl;
do
cin>>n;
while(n<=5)