函数和类(精)

上传人:小** 文档编号:61904359 上传时间:2018-12-14 格式:PPT 页数:78 大小:412KB
返回 下载 相关 举报
函数和类(精)_第1页
第1页 / 共78页
函数和类(精)_第2页
第2页 / 共78页
函数和类(精)_第3页
第3页 / 共78页
函数和类(精)_第4页
第4页 / 共78页
函数和类(精)_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《函数和类(精)》由会员分享,可在线阅读,更多相关《函数和类(精)(78页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计,主讲:夏力前,学习目标,掌握函数的定义与调用 掌握类的定义和实现方法 掌握类中成员变量以及成员函数的定义和应用方法类的对象 理解并掌握类对象的构造和析构过程 掌握对象数组、对象指针的用法 掌握友元函数及友元类的定义和应用,5.1 函数,函数的定义与调用 函数的定义 函数返回类型 函数名(参数表) /函数体 返回值是函数处理的结果,函数运行结束,返回值从被调函数传给主调函数。在定义函数时必须声明函数的返回值类型。如果函数没有返回值,需要将函数的返回值类型声明为void。,例5-1:计算整数的绝对值,#include using namespace std; int input ()

2、 int val; cout val; return val; /返回输入的数据 int myAbs(int nVal) return (nVal =0 ? nVal:-nVal); /返回计算结果 void output( int aVal) cout “The absolute value is: “ aVal endl; /函数无返回值,可以不写return语句,例5-1(续),void main() int nVal, nabs; char nFlag = Y; int input(); /函数原型声明 int myAbs (int); /函数原型声明 void output( int

3、); /函数原型声明 while (nFlag = Y | nFlag = y) nVal= input (); nabs= myAbs (nVal); output( nabs); cout nFlag; ,例5-2:尝试求多个数的绝对值,#include using namespace std; int myAbs(int nVal) return (nVal =0 ? nVal:-nVal); void main() cout “The absolute value of 3.14: ” myAbs (3.14) endl; cout “The absolute value of A i

4、s: ” myAbs (A)endl; /编译错误,函数参数列表不匹配 / cout “Is this right? ”abs(3,4)endl; ,5.1.2 函数参数的单向传递,函数的参数传递指的就是形参与实参结合(简称形实结合)的过程,形实结合的方式有传值、传引用、传地址三种。函数体是函数功能的实现代码。 函数的形参相当于函数的局部变量,只有载函数被调用时才被分配内存空间,然后用实参的值去初始化形参。 C+中参数传递方法是传递参数的值,也就是用实参的值去初始化形参。,例5-3:交换算法的尝试,#include using namespace std; void Swap(int a, i

5、nt b); int main() int x(5), y(10); cout“x=“x“ y=“yendl; Swap(x,y); cout“x=“x“ y=“yendl; void Swap(int a, int b) int t; t=a; a=b; b=t; ,5.1.3 引用类型的参数,给变量起别名(声明引用可以实现参数的双向传递。 引用必须在声明的时候进行初始化,一经初始化就不能改变,这个“不能改变”指的是引用关系不可变,也就是说在程序运行的全过程中一个引用只能始终作为同一个变量的别名。,例5-4:给变量一个别名,#include using namespace std; void

6、 main() float radius=3.2; float ,例5-5:通过引用访问变量,#include #include using namespace std; int main() int num1(3),num2(5); int ,例5-6:交换算法的再尝试,#include using namespace std; int main() void Swap(int ,5.1.4 指针类型的参数,指针作为函数的参数,同样可以实现参数的双向传递。 指针作为函数的参数传递的是内存单元的地址。 通过指针和引用都可以实现参数的双向传递。指针类型是从C语言继承的,其语法过于繁琐,降低了程序

7、的可读性。在C+中新增的引用类型,主要是作为函数的参数使用,既能起到与指针类型参数同样的效果,又避免了指针繁琐的语法。,例5-7:交换算法的再尝试,#include using namespace std; int main() void Swap(int* pa, int* pb); int x(5), y(10); cout“x=“x“ y=“yendl; Swap( ,5.1.5 数组类型的参数,数组元素作为函数的实参,函数的形参应该是数组元素类型的变量。 如果在函数之间需要共享的是大批类型相同的数据,那我们就可以将这样一批数据构成一个数组,仅仅以数组名(也就是数组的起始地址)作为参数在

8、函数之间传递,这样仅仅付出传递一个地址的开销,主调函数与被调函数之间就可以通过数组名(数组的起始地址)共享大批数据了。,例5-8:调用函数更改组元素的尝试,#include using namespace std; void change(int x) x=3; int main() int array5=1,3,5,7,9; change(array2); coutarray2endl; ,例5-9:一个数组初始化函数,#include using namespace std; void InitialVecValue (int nVal10) for (int i=0; i10; i+)

9、nVali = i; void main() int nVal110; InitialVecValue(nVal1); cout “The ninth value of nVal1 is: ”nVal19endl; ,例5-9(续),形参表中的一维数组元素个数也可以缺省写成int nVal,这样就会在执行函数调用时按照实参数组的实际元素个数来初始化形参数组,这样一个函数就可以处理不同长度的数组。这就需要再增加一个int参数来指定元素个数。例5-9程序可以修改如下:,例5-9(续),#include using namespace std; void InitialVecValue (int n

10、Val, int length) for (int i=0; i length; i+) nVali = i; cout “The last value of the array is: “nVallength-1endl; void main() int nVal110; int nVal25; InitialVecValue(nVal1,10); InitialVecValue(nVal2,5); ,例5-9(续),也可以用一个指针变量作为形参来接受数组首地址。指向数组起始地址的指针也可以当作数组名用。但还需要一个int参数指明数组的元素个数。例5-9程序可以修改如下:,例5-9(续),#

11、include using namespace std; void InitialVecValue (int *nVal, int length) for (int i=0; i length; i+) *(nVal+i)=i; /或者nVali = i; cout “The last value of the array is: “*(nVal+length-1)endl; /或者cout “The last value of the array is: “nVallength-1endl; void main() int nVal110; int nVal25; InitialVecVal

12、ue(nVal1,10); InitialVecValue(nVal2,5); ,5.1.6缺省参数值,C+允许为函数参数设置缺省值,设置了缺省值的参数也可以在调用时不给实参,使用缺省值来初始化形参。当然如果给出了全部实参值就用实参来初始化形参。 缺省的参数值可以声明在函数定义时,也可以声明在函数原型中,但是在同一个作用域中不能多次声明缺省参数值。处在不同作用域中的函数原型可以声明不同的缺省参数值。在形参表中,缺省参数值的声明必须连续列在参数表的右端。,例5-10:计算面积,#include using namespace std; const double PI = 3.1415926; d

13、ouble CalculateCircleArea(double nRadius = 0) return (PI*nRadius*nRadius); double CalculateTriangleArea(double nBottom =0, double nHeight =0) return (0.5*nBottom*nHeight); void main() cout ”Without giving the radius, the area of the circle is: ” CalculateCircleArea()endl; cout ”After specifying the

14、radius to 5, the area is: ” CalculateCircleArea(5)endl; cout ”The area of a triangle with bottom of 3 and height 3 is: ” CalculateTriangleArea(3,3)endl; ,5.1.7省略参数,在某些情况下,我们无法列出传递给函数的所有实参的类型和数目,此时我们需要用省略号指定函数参数表。 省略号挂起类型检查机制,它的出现告知编译器,当函数被调用的时候,可以有0或者多个实参,而实参的类型未知。例如C语言的printf函数的参数列表就是省略号指定的。,5.1.8

15、嵌套与递归调用,函数可以嵌套调用,即函数1调用函数2,函数2又调用函数3。这种嵌套调用机制可以很方便地实现面向过程的软件开发中自顶向下逐步求精的分析与设计方法。嵌套调用的层数在语法上没有限制,但是会受到运行环境中栈空间大小的限制。 直接或者间接调用自己的函数被称为递归函数。,例5-11:函数的嵌套调用,#include using namespace std; void Swap(int ,例5-11(续),int main() int a,b; cout a; cout b; couta“ 和 “ b“ 的最大公约数是:“ CommonDivisor(a,b) endl; return 0;

16、 ,例5-12:计算阶乘,#include using namespace std; long CalculateFactor(int n) long f; if (nn; y= CalculateFactor(n); cout n”!=”yendl; ,5.1.9 内联函数,函数的代码非常简单,调用函数的开销可能会大于函数运行的开销,这样在时间和空间效率上就不能令人满意。C+中提供了内联函数的机制。 定义内联函数需要用inline关键字,若一个函数被指定为内联,它将在每个调用点上被“内联地”展开。 注意:内联函数必须是简单的函数,结构简单、语句少,不能有循环语句,内联函数的定义必须出现在调用之前。,5.1.10 函数指针,函数名

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号