高级语言C++程序设计 (第二版) 刘景、周玉龙編
高级语言C++程序设计 (第二版) 刘景、周玉龙编
第五章函数、函数与运算符的重载 51三次方程求根程序设计 三次方程x+mx+q=0求根的 Cardan公式: Xr=3 1、设计一个求立方根的函数 float cuberooti( float x)/由迭代公式求,P128 float root croot const float eps=le-6 croot=Xi doriot=croot croot=(2 root+x/root*root)/3;1 while( fabs(croot-root>eps return(croot)
第五章 函数、函数与运算符的重载 ◼ 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)} 0 3 + px + q = x 3 2 3 3 2 3 ) 3 ) ( 2 ) ( 3 ) ( 2 ( 2 2 q q p q q p x r = − + + + − − +
第五章函数、函数与运算符的重载 2、整个程序结构(P129) //program5-1 cpp #indlude #include float cuberoot(float x; void main( float p, g,xr; cout>p>>qi float a=sqrt(q/2)*(q/2)+(q/3)*(q/3)*(q/3) Xr=cuberoot(-q/2+a)+cuberoot(-/2-a; cout <endk<<The real root of the equation is: <<xr; y float cuberoot(float x
第五章 函数、函数与运算符的重载 2、整个程序结构(P.129.) //program5-1.cpp #include #include float cuberoot(float x); void main() { float p,q,xr; cout>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) {…}
第五章函数、函数与运算符的重载 52函数的说明与使用 521函数说明 1、函数原型(P130~131) 函数原型(亦称函数声明):用来指出函数的名称、类型和参数。 格式:[属性说明]() 说明:属性说明有 inline、 static、 virtual、 friend等。 2、函数定义(P131) 格式:[属性说明]() 函数体> 522函数的调用(P132) 格式:()
第五章 函数、函数与运算符的重载 ◼ 5.2 函数的说明与使用 5.2.1 函数说明 1、函数原型(P.130~131.) 函数原型(亦称函数声明):用来指出函数的名称、类型和参数。 格式:[属性说明]() 说明:属性说明有inline、static、virtual、friend等。 2、函数定义(P.131.) 格式: [属性说明]() { } 5.2.2 函数的调用(P.132.) 格式: ()
第五章函数、函数与运算符的重载 523函数的返回 说明:函数的返回要完成两项任务:把运行控制从函数体返回到函 数调用点;返回所需要的数据值。 1、返回void类型 2、返回数值类型 3、返回引用类型(该函数调用后返回的不单是值,而是包含返回值 的变量(或对象)) 524函数的参数 1、无参函数: void printo 2、一个或多个参数: void sort( int n int* array){ 3、不定个数参数: void sort( int n, float*a)//n是变化的,a是数组起始指针。 void abc(inti…) 注:无名参数和缺省参数。(P134.)
第五章 函数、函数与运算符的重载 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 swap(int a int b) int temp=aj a=b b=tempi } 2、引用调用方式:实参传递给形参是双向传递,值可回带。 void swap2(int &a,int &b int temp=aj a=bi b=temp; 1
第五章 函数、函数与运算符的重载 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 swap(int *a, int *b) int temp= a; a=*b: *b=tempi } 说明:在参数传递中,指针方式和引用方式可以完成相同的任务, 但引用方式优于指针方式,在类对象的参数传递中,多数都是引 用方式。 526内联函数 定义格式: inline(参数表){…} 说明:在编译过程中,凡内联函数,系统把它的执行代码插入到该 函数的每个调用点,从而使程序执行过程中,每次调用该函数时 不需转移控制点。(与预编译处理中的宏定义类似)
第五章 函数、函数与运算符的重载 3、指针调用方式:实参传递给形参是双向传递,值可回带。 void swap1(int *a,int *b) { int temp=*a; *a=*b; *b=temp; } 说明:在参数传递中,指针方式和引用方式可以完成相同的任务, 但引用方式优于指针方式,在类对象的参数传递中,多数都是引 用方式。 5.2.6 内联函数 定义格式:inline (参数表){…} 说明:在编译过程中,凡内联函数,系统把它的执行代码插入到该 函数的每个调用点,从而使程序执行过程中,每次调用该函数时 不需转移控制点。(与预编译处理中的宏定义类似)
第五章函数、函数与运算符的重载 53函数的嵌套与递归 531函数嵌套 函数嵌套:一个函数的函数体中包含一个或多个函数调用语句,即 称为函数嵌套。(函数嵌套调用所占用的空用,用栈的方式管 理。) 示例:P138~140 532函数的递归 概念:函数A在其函数体中直接包含对它自已的调用语句,这种调用 称为直接递归调用,函数A称为直接递归函数。(如果函数A在 其函数体内间接地包含了对它自己的调用,则函数A称为间接递 归函数。 示例:P140~142 54函数与运算符的重载 541函数重载 函数重载:是函数名的重载,即支持多个不同的函数采用同一名字
第五章 函数、函数与运算符的重载 ◼ 5.3 函数的嵌套与递归 5.3.1 函数嵌套 函数嵌套:一个函数的函数体中包含一个或多个函数调用语句,即 称为函数嵌套。(函数嵌套调用所占用的空用,用栈的方式管 理。) 示例:P.138~140. 5.3.2 函数的递归 概念:函数A在其函数体中直接包含对它自已的调用语句,这种调用 称为直接递归调用,函数A称为直接递归函数。(如果函数A在 其函数体内间接地包含了对它自己的调用,则函数A称为间接递 归函数。) 示例:P.140~142. ◼ 5.4 函数与运算符的重载 5.4.1 函数重载 函数重载:是函数名的重载,即支持多个不同的函数采用同一名字
第五章函数、函数与运算符的重载 实现函数重载必须满足下列条件之一:(P142) 参数表中对应的参数类型不同。 参数表中参数的个数不同。 参数表中不同类型参数的次序不同。 注意几点:(P143) 返回类型不能区分函数。 采用引用参数能区分函数 派生基本类型的参数可能造成二义性。 包含可缺省参数时,可能造成二义性 54.2可重载运算符 可重载的运算符:P144 不可重载的运算符:限定符和:;条件运算符?:;取长度运算符 sizeof。P.144. 关于前缀+十和后缀十十运算符重载的规定:在后缀++的重载函数 的原型参数表中增加一个int类型的无名参数。P145
第五章 函数、函数与运算符的重载 实现函数重载必须满足下列条件之一: (P.142.) ➢ 参数表中对应的参数类型不同。 ➢ 参数表中参数的个数不同。 ➢ 参数表中不同类型参数的次序不同。 注意几点: (P.143.) ➢ 返回类型不能区分函数。 ➢ 采用引用参数能区分函数。 ➢ 派生基本类型的参数可能造成二义性。 ➢ 包含可缺省参数时,可能造成二义性。 5.4.2 可重载运算符 可重载的运算符:P.144. 不可重载的运算符:限定符.和::;条件运算符?:;取长度运算符 sizeof。P.144. 关于前缀++和后缀++运算符重载的规定:在后缀++的重载函数 的原型参数表中增加一个int类型的无名参数。P.145
第五章函数、函数与运算符的重载 5.43运算符重载函数的定义 格式: operator.(参数表){} 示例 enum BookFALSE TRUE]i Bool operator Bool a, Bool b if((a==FALSE)&&(b==FALSED return False return TrUe 55函数与C++程序结构 551库函数(标准函数)的使用 说明:用# include”头文件”包含相应的头文件,即可调用。 552SP框架结构
第五章 函数、函数与运算符的重载 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框架结构