首页 百科知识 用类名做函数参数类型

用类名做函数参数类型

时间:2022-10-16 百科知识 版权反馈
【摘要】:在使用函数的过程中,主要包括3个方面,即函数的声明、函数的定义和函数的调用。函数名是程序员自己起的函数名,需符合标识符的命名规则。例如现在已经声明了一个函数,它是用来排序的。另外,函数返回类型和return后面的返回值的类型必须一致。特殊的一点是main函数是程序执行的入口,它只能被系统来调用。另外,实参的作用是为了给形参传递数据。函数调用结束将结果返回至函数调用处。

5.3 函数的使用

在使用函数的过程中,主要包括3个方面,即函数的声明、函数的定义和函数的调用。下面分别来介绍。首先看一个完整的程序实例。

【例5.1】根据用户输入的整数输出指定行数的图形。

img160

运行结果如图5-1所示。

img161

图5-1

通过上述实例可以总结出使用函数时程序结构的通用形式:

img162

5.3.1 函数声明

函数声明也称函数原型,声明就是告诉编译系统有这样一个函数,包括函数的返回类型、函数名、参数个数以及参数类型等信息。掌握了这些信息,在后面的函数调用时编译系统可以有效地检查调用是否正确或有效。声明的语法规则为:

函数返回类型函数名(参数类型列表);

如程序5.1中第2行

img163

函数返回类型即函数返回值类型,若函数无返回值可用void来代替。函数名是程序员自己起的函数名,需符合标识符的命名规则。括号中列出函数的参数个数和类型,在调用时必须按照声明时列出的参数个数、次序和类型来传递参数,多个参数间用逗号分隔。特别注意,括号后面有分号。如果函数声明中的括号中是空的,即属于5.2节所述的无参函数。显然outputDals函数是带参函数,而且只含有一个参数。下面看一组实例。

(1)char display(char,char);

(2)int search(int,int,char);

(3)double add(double,float,double);

(4)void sort(int[],int);

(5)void print();

第1个例子中的display函数共包含两个参数,均为char类型且最后返回的也是一个char类型的数据。第2个例子中的search函数则含有两个int型参数和一个char型参数,返回一个int型数据。注意在调用时的参数顺序必须和声明时的顺序一致,否则出错。add函数同样含有三个参数,分别为double、float、double类型,最终的函数返回值为double类型。第4个例子中的sort函数返回类型为void,即无返回值,且含有两个参数,第一个为一个int型数组,第二个是一个普通的int型变量。第5个例子中的print函数无返回值,且无参数。

说明:在函数声明时,函数名后的括号中也可以出现参数名。以上述第1个例子中的函数display为例,下列写法也是正确的。

char display(char c1,char c2);

c1、c2为参数名,在编译时其实是被忽略掉的。

5.3.2 函数定义

前面介绍了函数声明,但是声明并不包含函数具体功能的实现。例如现在已经声明了一个函数,它是用来排序的。到底怎么排序,或者说排序的代码写在哪里呢?这就需要函数定义了。

函数定义又包含两部分:函数首部和函数体。其中函数首部形式上和函数声明类似,只是多加了参数的名字。函数体中包含具体的功能实现代码。定义的具体语法规则如下:

img164

从开始花括号到结束花括号即为函数体,函数体中一般首先写需要用到的变量声明语句,然后是其他一些需要的语句,而函数返回值由return语句来实现。

说明:函数定义时,函数体内不得包含另外一个函数的定义,即函数不允许嵌套定义。

例如程序5.1中的第10~19行为outputDals函数的详细定义。

img165

下面对函数声明和函数首部做个对比:

img166

括号中,函数首部比函数声明多了lines这个参数名,而且这个参数有个专业术语称为形式参数(简称形参)。函数声明中最后包含分号,而函数首部是不允许加分号的,因为后面还有紧跟着的函数体。下面看一个函数定义的例子。

img167

img168

recArea函数定义中第一行是函数首部,括号中的l、w均为形式参数,花括号中是函数体,首先定义了一个area变量用来存放矩形的面积,最后返回这个结果。

提示:函数定义中如果需要返回值,使用return语句来返回。具体方法为

return返回值;

或者

return(返回值);

另外,函数返回类型和return后面的返回值的类型必须一致。当函数无返回值时,函数类型可写为void,这时不需要return语句。

再看一个类型为void的函数定义的例子。

img169

displayGra函数无返回值,其类型为void,括号中也没有参数即为无参函数。

在具体使用时,函数定义也可以整体放在主函数之前,这时就不需要单独声明函数了。下面以上述的displayGra()函数为例写一个完整的程序。

【例5.2】利用函数输出一个图形。

img170

img171

运行结果如图5-2所示。

img172

图5-2

分析:

上述程序中相当于把函数声明和函数定义“合并”在一起,放在了main函数之前。该程序也可以正常运行,但是最好还是按照上面总结的通用形式来写程序。可以试想一下,一个程序中的所有函数定义有几十行或者上百行代码,如果把所有的函数定义都写在main函数之前会有什么感觉?显然是头重脚轻,找了半天还没看见main函数。

说明:这里再提一下main函数。你一定注意到了main函数也有类型int型,函数体中也有return语句,这些都与函数的语法规则是一致的。特殊的一点是main函数是程序执行的入口,它只能被系统来调用。

5.3.3 函数调用

函数原型和函数定义都有了,接下来就该函数调用出场了。函数调用的语法规则为:

函数名(参数列表);

说明:调用时,括号中的参数称为实际参数(简称实参),只需要列出参数名即可,不用加参数类型。这和函数声明及函数定义中的函数首部有所区别。另外,实参的作用是为了给形参传递数据。函数调用结束将结果返回至函数调用处。

程序5.1中的调用实例:

img173

括号中的n为实参,并且n的值会传递给形参lines。

在调用函数时,无返回类型的函数(类型为void)其调用的方法比较简单,如outputDals函数。即函数调用语句可以作为一条单独的语句。前面的displayGra函数的调用方法为:

img174

调用带返回类型的函数通常有两种方法:其一,将调用结果赋给同类型的某个变量;其二,直接作为printf()的输出项来使用。

下面以前面的recArea函数为例,具体调用方法如下:

第一种方式:

img175

第二种方式:

img176

函数调用时涉及参数传递问题,调用结束后会返回至函数调用处,以图5-3为例说明这个问题。图中的函数以recArea()为例。

img177

图5-3 参数传递

图中x、y为实参即输入的长和宽,函数定义中的l、w为形参,调用时x、y的值分别传递给l和w,调用结束后计算出来的矩形的面积还要返回到函数调用处即将值赋给了main函数中的s,最后输出的面积即s的值。关于参数传递的更多知识详见5.4节。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈