第五周 C++问题的模块化求解
5.1模块化程序设计
模块化程序的组成
编写一个规模较大的程序,可按其功能划分为若干相对独立的模块。
好处:
- 程序开发更易控制
- 利于软件复用
- 避免重复代码
- 容易调试和维护
函数的概念:
main()主函数、库函数(标准函数)、用户定义函数
5.2函数的定义
###函数的定义
1、函数定义的一般格式:
<函数返回值类型> <函数名>(<形式参数表>) //函数头
{
语句序列; //函数体
}
2、函数值类型-即函数的返回值类型
(1)返回简单类型:int、long、float、double、char等
(2)返回结构类型
(3)返回指针类型
(4)返回引用类型
(5)无类型、空类型:void
3、形式参数表(形参表)
函数的参数表应用于实现函数间的数据联系。
格式:<类型名1> <形参名1>,<类型名2> <形参名2>,…
注意:每个形参必须同时给出形参的类型和名称;函数也可以没有参数。
//形参是在函数调用时分配存储空间,同时接受实参的值。当函数执行结束后,系统将自动释放形参所分配的存储空间。因此,形参属于函数的局部变量,只能在该函数中使用。
当形参为引用类型或指针类型是,利用形参不仅可以访问实参的值,还可以改变实参的值。
4、函数体
由{}括起来的语句序列构成,是实现函数功能的主体。
5.3函数的声明
函数的声明
在C++中,程序编译的单位是源程序文件(即源文件),一个由多个函数构成的程序可以组织存放在一个或多个源文件中。
在源文件中,应满足”先定义后使用”的原则。
标准库函数:用#include命令包含头文件
自定义函数:要么在调用之前定义,要么在调用之前作函数声明。
函数的声明格式:
<类型名> <函数名>(<类型1> <形参1>,<类型2> <形参2>,…) ;
或者
<类型名> <函数名>(<类型1>,<类型2>,…) ; //可省略形参名
函数声明说明了函数所采用的形式,称为函数原型。
5.4函数的调用格式
函数的调用
- 函数定义后,并不能自动执行,必须通过函数调用来实现函数的功能。
- 函数调用,即控制执行某个函数。
- C++中,主函数可以调用其他子函数,其他子函数之间也可以相互调用。
函数调用的格式:
一般格式:<函数名> (<实际参数表>) //有参调用
或者 <函数名> () //无参调用
实参表与形参表中参数的个数、类型和次序应保持一致。
当调用无参函数时,函数后圆括号不能省略。
1、实参的几种形式
形参为简单类型变量----实参:常量、变量以及表达式
形参为数组====实参:数组(名)
形成为结构体类型----实参:结构类型变量
2、函数调用的形式
(1)作为一个独立语句调用(用于无返回值函数)
(2)出现在表达式中(适于有返回值的函数)
3、函数的嵌套调用
就是指调用一个函数的过程中,被调用函数又调用了另一个函数。
5.5函数的传递方式
C++中有又三种传递方式:值传递、引用传递、指针传递
1、值传递:
调用时,将实参的值传递给对应的形参。
由于形参有自己独立的存储空间,又作为函数局部变量使用,因此在函数中改变形参值不会对实参变量的值。
好处:减少函数之间的数据依赖,增强了函数自身的独立性。
注意:函数的形参声明为简单类型或结构类型变量,实参与形参将采用值传递。
2、引用传递:
(1)引用:
引用是一种特殊的额变量,它被认为是一个变量的别名。
格式: <目标变量数据类型> &<引用名>=<目标变量名>;
例如: int a.&b=a;
此时,b为a的一个引用,使用a与使用b是等价的,二者共用内存空间。
定义一个引用时,如果该引用不是用作参数或返回值,则必须提供该引用的初值(即必须提供引用的目标变量名)
(2)引用传递:
为实现引用传递,这时函数的形参应定义为引用类型变量,而对应的实参应为变量名,该变量将用作引用的目标变量名。
作为形参的引用变量并不分配新的内存空间,它作为实参变量的别名,与其共用内存。
好处:
- 使用引用参数可以直接操作实参变量,从而实现通过修改形参的值而达到修改对应实参值的目的。
- 通过设置多个引用参数,可以从函数中带回多个结果值。
说明:引用作为形参,其引用的目标变量默认为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初值。
5.6为形参指定默认值
C++语言允许在函数定义时,为形参指定默认参数值。
例如: void f(int x=0,inty=2);// 这时合法的
可以对部分形参定义默认值。
但这时,默认值应出现在从右到左连续若干个形参中。
例如: void f(int i=0,int j,int k=3);//这个是错误的,必须从右至左依次指定
5.7数组名作为函数的参数
- 数组元素作实参:对应形参为变量,一次传递一个元素,采用值传递。
- 数组名作实参,对应的形参为一个数组,一次传递一整个数组。
- 且在数组作参数时,形参数组与实参数组共用同一暑促空间(即共用实参数组空间)。类似于引用传递,改变形参数组的值就是在改变实参数组的值。
1、一维数组的传递:
声明格式: <类型> <数组名>[]
其中,[]可以省略数组的长度值。(可认为形参数组与实参数组长度相同)
对应的实参应为同类型的一维数组名。(仅使用数组名)
说明:为了使函数知道需要出列的数组元素的个数,通常给函数再传递一个表示元素个数的整型数。
2、二维数组的传递:
声明格式: <类型> <数组名>[][<列数>]
其中:<列数>为常数,不能省略。
5.8结构体变量作为函数的参数
- 实参为结构体类型变量
- 形参也为同类型的结构变量
- 传递方式为值传递