没有合适的资源?快使用搜索试试~ 我知道了~
2023年面向对象程序设计复习辅导三.doc
0 下载量 135 浏览量
2022-10-26
22:33:59
上传
评论
收藏 297KB DOC 举报
温馨提示
试读
44页
2023年面向对象程序设计复习辅导三.doc
资源详情
资源评论
资源推荐
面向对象程序设计复习辅导(三)
---函 数
徐孝凯
一个 C++语言程序由若干个程序文献和头文献所组成,每个头文献中通常带有用户类型
的定义、符号常量的定义、函数的声明等内容,每个程序文献由若干个函数定义所组成,其
中必有一个并且只有一个程序文献中包具有主函数 main,称此程序文献为主程序文献。函
数是 C++程序中的基本功能模块和执行单元,这一章专门讨论函数的定义和调用,变量的作
用域和生存期等内容。
一、函数的定义
(一)定义格式
<类型名> <函数名> ([<参数表>]) <函数体>
<类型名>为系统或用户已定义的一种数据类型,它是函数执行过程中通过 return 语句
规定返回的值的类型,又称为该函数的类型。当一个函数不需要通过 return 语句返回一个
值时,称为无返回值函数或无类型函数,此时需要使用保存字 void 作为类型名。当类型名
为 int 时,可以省略不写,但为了清楚起见,还是写明为好。
<函数名>是用户为函数所起的名字,它是一个标记符,应符合 C++标记符的一般命名规
则,用户通过使用这个函数名和实参表可以调用该函数。
<参数表>又称形式参数表,它包具有任意多个(含 0 个,即没有)参数说明项,当多于
一个时其前后两个参数说明项之间必须用逗号分开。每个参数说明项由一种已定义的数据类
型和一个变量标记符组成,该变量标记符成为该函数的形式参数,简称形参,形参前面给出
的数据类型称为该形参的类型。一个函数定义中的<参数表>可以被省略,表白该函数为无参
函数,若<参数表>用 void 取代,则也表白是无参函数,若<参数表>不为空,同时又不是保
存字 void,则称为带参函数。
<函数体>是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条
C++语句。
在一个函数的参数表中,每个参数可认为任一种数据类型,涉及普通类型、指针类型、
数组类型、引用类型等,一个函数的返回值可以是除数组类型之外的任何类型,涉及普通类
型、指针类型和引用类型等。此外,当不需要返回值时,应把函数定义为 void 类型。
(二) 定义格式举例
(1) void f1() {...}
(2) void f2(int x) {...}
(3) int f3(int x,int* p) {...}
(4) char* f4(char a[]){...}
(5) int f5(int& x,double d) {...}
(6) int& f6(int b[10], int n) {...}
(7) void f7(float c[][N], int m, float& max) {...}
(8) bool f8(ElemType*& bt, ElemType& item) {...}
在第一条函数定义中,函数名为 f1,函数类型为 void,参数表为空,此函数是一个无
参无类型函数。若在 f1 后面的圆括号内写入保存字 void,也表达为无参函数。
在第二条函数定义中,仅带有一个类型为 int 的形参变量 x,该函数没有返回值。
在第三条函数定义中,函数名为 f3,函数类型为 int,函数参数为 x 和 p,其中 x 为 int
型普通参数,p 为 int*型指针参数。
在第四条函数定义中,函数名为 f4,函数类型为 char*,即字符指针类型,参数表中包
含一个一维字符数组参数。注意:在定义任何类型的一维数组参数时,不需要给出维的尺寸,
当然给出也是允许的,但没有任何意义。
在第五条函数定义中,函数名为 f5,返回类型为 int,该函数带有两个形参,一个为
整型引用变量 x,另一个为双精度变量 d。
在第六条函数定义中,函数名为 f6,函数类型为 int&,即整型引用,该函数带有两个
形参,一个是整型数组 b,另一个是整型变量 n。在这里定义形参数组 b 所给出的维的尺寸 10
可以被省略。
在第七条函数定义中,函数名为 f7,无函数类型,参数表中包含三个参数,一个为二
维单精度型数组 c,第二个为整型变量 m,第三个为单精度引用变量 max。注意:当定义一
个二维数组参数时,第二维的尺寸必须给出,并且必须是一个常量表达式,第一维尺寸可给
出也可不给出,其作用相同。
在第八条函数定义中,函数名为 f8,返回类型为 bool,即逻辑类型,该函数带有两个
参数,一个为形参 bt,它为 ElemType 的指针引用类型,另一个为形参 item,它是 ElemType
的引用类型,其中 ElemType 为一种用户定义的类型或是通过 typedef 语句定义的一个类型
的别名。
(三) 有关函数定义的几点说明
1. 函数原型语句
在一个函数定义中,函数体之前的所有部分称为函数头,它给出了该函数的返回类型、
每个参数的顺序和类型等函数原型信息,所以当没有专门给出函数原型说明语句时,系统就
从函数头中获取函数原型信息。
一个函数必须先定义或声明而后才干被调用,否则编译程序无法判断该调用的对的性。
一个函数的声明是通过使用一条函数原型语句实现的,当然使用多条相同的原型语句声明同
一个函数虽然多余但也是允许的,编译时不会出现错误。
在一个完整的程序中,函数的定义和函数的调用可以在同一个程序文献中,也可以处在
不同的程序文献中,但必须保证函数原型语句与函数调用表达式出现在同一个文献中,并且
函数原型语句出现在前,函数的调用出现在后。
通常把一个程序中用户定义的所有函数的原型语句组织在一起,构成一个头文献,让该
程序中所含的每个程序文献的开始(即所有函数定义之前)包含这个头文献(通过#include
命令实现),这样不管每个函数的定义在哪里出现,都可以保证函数先声明后使用(即调用)
这一原则的实现。
一个函数的原型语句就是其函数头的一个拷贝,当然要在最后加上语句接上结束符分号。
函数原型语句与函数头也有细微的差别,在函数原型语句中,其参数表中的每个参数允许只
保存参数类型,而省略参数名,并且若使用参数名也允许与函数头中相应的参数名不同。
2. 常量形参
在定义一个函数时,若只允许函数体访问一个形参的值,不允许修改它的值,则应把该
形参说明为常量,这只要在形参说明的前面加上 const 保存字进行修饰即可。如:
void f9(const int& x, const char& y);
void f10(const char* p, char key);
在函数 f9 的函数体中只允许使用 x 和 y 的值,不允许修改它们的值。在函数 f10 的函
数体中只允许使用 p 所指向的字符对象或字符数组对象的值,不允许修改它们的值,但在函
数体中既允许使用也允许修改形参 key 的值。
3. 缺省参数
在一个函数定义中,可根据需要对参数表末尾的一个或连续若干个参数给出缺省值,当
调用这个函数时,若实参表中没有给出相应的实参,则形参将采用这个缺省值。如:
void f11(int x, int y=0) {...}
int f12(int a[], char op='+', int k=10) {...}
函数 f11 的定义带有两个参数,分别为整型变量 x 和 y,并且 y 带有缺省值 0,若调用
该函数的表达式为 f11(a,b),将把 a 的值赋给 x,把 b 的值赋给 y,接着执行函数体;若调
用该函数的表达式为 f11(a+b),则也是对的的调用格式,它将把 a+b 的值赋给 x,因 y 没有
相应的实参,将采用缺省值 0,参数传送后接着执行函数体。
函数 f12 的定义带有三个参数,其中后两个带有缺省值,所以调用它的函数格式有三种,
一种只带一个实参,用于向形参 a 传送数据,后两个形参采用缺省值,第二种带有两个实参,
用于分别向形参 a 和 op 传送数据,第三个形参采用缺省值,第三种带有三个实参,分别用
于传送给三个形参。
若一个函数带有专门的函数原型语句,则形参的缺省值只能在该函数原型语句中给出,
不允许在函数头中给出。如对于上述的 f11 和 f12 函数,其相应的函数原型语句分别为:
void f11(int x, int y=0);
int f12(int a[], char op='+', int k=10);
函数定义应分别改写为:
void f11(int x, int y) {...}
int f12(int a[], char op, int k) {...}
4. 数组参数
在函数定义中的每个数组参数事实上是指向元素类型的指针参数。对于一维数组参数说
明:
<数据类型> <数组名>[]
它与下面的指针参数说明完全等价:
<数据类型> *<指针变量名>
其中<指针变量名>就是数组参数说明中的<数组名>。如对于 f12 函数定义中的数组参数
说明 int a[],等价于指针参数说明 int* a。也就是说,数组参数说明中的数组名 a 是一个
类型为 int*的形参。注意:在变量定义语句中定义的数组,其数组名代表的是一个数组,
它的值是指向第一个元素的指针常量,这与数组形参的含义有区别。
对于二维数组参数说明:
<数据类型> <参数名>[][<第二维尺寸>]
它与下面的指针参数说明完全等价:
<数据类型> (*<参数名>)[<第二维尺寸>]
如对于 f7 函数定义中的二维数组参数说明 float c[][N],等价于指针参数说明
float(*c)[N]。
5. 函数类型
当调用一个函数时就执行一遍循环体,对于类型为非 void 的函数,函数体中至少必须
带有一条 return 语句,并且每条 return 语句必须带有一个表达式,当执行到任一条 return
语句时,将计算出它的表达式的值,结束整个函数的调用过程,把这个值作为所求的函数值
带回到调用位置,参与相应的运算;对于类型为 void 的函数,它不需要返回任何函数值,
所以在函数体中既可以使用 return 语句,也可以不使用,对于使用的每条 return 语句不允
许也不需要带有表达式,当执行到任一条 return 语句时,或执行到函数体最后结束位置时,
剩余43页未读,继续阅读
智慧安全方案
- 粉丝: 3709
- 资源: 59万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0