高级语言 C++程序设计
(第二版)
刘景、周玉龙编第五章 函数、函数与运算符的重载
5.1 三次方程求根程序设计三次方程 求根的 Cardan公式:
1,设计一个求立方根的函数
float cuberoot(float x)//由迭代公式求,P.128.
{
float root,croot;
const float eps=1e-6;
croot=x;
do{root=croot;
croot=(2*root+x/(root*root))/3;}
while(fabs(croot-root)>eps);return(croot)}
03 qpxx
3
32
3
32
)3()2()3()2( 22 pqpq qqxr
第五章 函数、函数与运算符的重载
2,整个程序结构 (P.129.)
//program5-1.cpp
#include<iostream.h>
#include<math.h>
float cuberoot(float x);
void main()
{
float p,q,xr;
cout<<“Input parameters p,q:”;
cin>>p>>q;
float a=sqrt((q/2)*(q/2)+(q/3)*(q/3)*(q/3));
xr=cuberoot(-q/2+a)+cuberoot(-q/2-a);
cout<<endl<<“The real root of the equation is:”<<xr;}
float cuberoot(float x) {… }
第五章 函数、函数与运算符的重载
5.2 函数的说明与使用
5.2.1 函数说明
1,函数原型( P.130~131.)
函数原型(亦称函数声明),用来指出函数的名称、类型和参数。
格式,[属性说明 ]<类型 ><函数名 >( <形式参数表 >)
说明,属性说明有 inline,static,virtual,friend等。
2、函数定义( P.131.)
格式,[属性说明 ]<类型 ><函数名 >( <形式参数表 >)
{
<函数体 >
}
5.2.2 函数的调用( P.132.)
格式,<函数名 >( <实际参数表 >)
第五章 函数、函数与运算符的重载
5.2.3 函数的返回说明,函数的返回要完成两项任务:把运行控制从函数体返回到函数调用点;返回所需要的数据值。
1,返回 void类型
2、返回数值类型
3,返回引用类型(该函数调用后返回的不单是值,而是包含返回值的变量(或对象))
5.2.4 函数的参数
1,无参函数,void print();
2、一个或多个参数,void sort(int n,int *array){… }
3,不定个数参数:
void sort(int n,float *a);//n是变化的,a是数组起始指针。
void abc(int i,… );
注:无名参数和缺省参数。( P.134.)
第五章 函数、函数与运算符的重载
5.2.5 值调用与引用调用(指针调用)
1、赋值调用方式,实参传递给形参是单向传递,不回带值 。
void swap1(int a,int b)
{
int temp=a;
a=b;
b=temp;
}
2,引用调用方式,实参传递给形参是双向传递,值可回带。
void swap2(int &a,int &b)
{
int temp=a;
a=b;
b=temp; }
第五章 函数、函数与运算符的重载
3、指针调用方式,实参传递给形参是双向传递,值可回带。
void swap1(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
说明,在参数传递中,指针方式和引用方式可以完成相同的任务,
但引用方式优于指针方式,在类对象的参数传递中,多数都是引用方式。
5.2.6 内联函数定义格式,inline <数型 ><函数名 >(参数表 ){… }
说明,在编译过程中,凡内联函数,系统把它的执行代码插入到该函数的每个调用点,从而使程序执行过程中,每次调用该函数时不需转移控制点。(与预编译处理中的宏定义类似)
第五章 函数、函数与运算符的重载
5.3 函数的嵌套与递归
5.3.1 函数嵌套函数嵌套,一个函数的函数体中包含一个或多个函数调用语句,即称为函数嵌套。(函数嵌套调用所占用的空用,用栈的方式管理。)
示例,P.138~140.
5.3.2 函数的递归概念,函数 A在其函数体中直接包含对它自已的调用语句,这种调用称为直接递归调用,函数 A称为直接递归函数。(如果函数 A在其函数体内间接地包含了对它自己的调用,则函数 A称为间接递归函数。)
示例,P.140~142.
5.4 函数与运算符的重载
5.4.1 函数重载函数重载,是函数名的重载,即支持多个不同的函数采用同一名字。
第五章 函数、函数与运算符的重载实现函数重载必须满足下列条件之一,( P.142.)
参数表中对应的参数类型不同。
参数表中参数的个数不同。
参数表中不同类型参数的次序不同。
注意几点,(P.143.)
返回类型不能区分函数。
采用引用参数能区分函数。
派生基本类型的参数可能造成二义性。
包含可缺省参数时,可能造成二义性。
5.4.2 可重载运算符可重载的运算符,P.144.
不可重载的运算符,限定符,和,:;条件运算符?:;取长度运算符
sizeof。 P.144.
关于前缀 ++和后缀 ++运算符重载的规定,在后缀 ++的重载函数的原型参数表中增加一个 int类型的无名参数。 P.145.
第五章 函数、函数与运算符的重载
5.4.3 运算符重载函数的定义格式,<操作结果类型 > operator<运算符 >(参数表 ) {… }
示例,
enum Bool{FALSE,TRUE};
Bool operator +(Bool a,Bool b)
{
if((a==FALSE)&&(b==FALSE))
return FALSE;
return TRUE;
}
5.5 函数与 C++程序结构
5.5.1 库函数(标准函数)的使用说明,用 #include,头文件,包含相应的头文件,即可调用。
5.5.2 SP框架结构第五章 函数、函数与运算符的重载一个 SP框架的完整 C++程序组成:
一个主函数:它可调用其他函数,但不能被调用。
任意多个用户定义函数:平行定义,可以相互调用。
全局说明:在所有函数定义之外的变量说明和函数原型。
预处理命令:在进行预处理后,这部分被取代。
注释:只起方便阅读的作用,编译后被删除。
较大程序(一般含有多个程序文件)的程序文件划分的一般方法:
根据主函数和各用户定义的函数的功能及相互关系,把它们划分成若干个,CPP文件。
按与每个,CPP程序文件中的函数有关的全局说明组成一个或多个,h( 头)文件。
程序中使用库函数组成的若干,CPP文件和对应的,h文件。
5.5.3 函数间的数据传递
1、通过赋值参数和返回语句( P.148.)
第五章 函数、函数与运算符的重载
2、通过全局变量( P.149.)
3,通过指针类型参数和引用参数( P.149.)
4、函数的数组类型参数( P.149~150.)
5.5.4 变量与函数的作用域
1、外部存储属性( extern) 与静态存储属性( static)
2,名字的生存期与作用域( P.152~153.)
5.6 程序实例
5.6.1,三色冰淇淋,程序(求排列数和组合数)
P.153~155.
5.6.2 Hanoi塔问题
P.155~157.