《第9章 从结构化程序设计到面向对象.ppt》由会员分享,可在线阅读,更多相关《第9章 从结构化程序设计到面向对象.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章 从结构化程序设计从结构化程序设计到面向对象的程序设计到面向对象的程序设计 1教学目标n了解C+对C的扩充和改进n掌握面向对象程序设计的基本思想和方法n掌握面向对象的概念n理解面向对象程序设计的特性29.1 C+对C的改进和扩充 9.2 面向对象程序设计方法39.1 C+对C的改进和扩充v输入输出流v函数的重载v带默认参数的函数v内联函数v一元作用域运算符v引用与函数4v输入输出流nscanf和printf输入输出的缺陷n输入输出流的概念:n输入输出是以字节流的形式实现的,流实际上是一个字节序列。n在输入操作中,字节从输入设备流向内存;输出操作中,字节从内存流向输出设备。5n流是一个
2、抽象的概念,实际进行输入输出时,流通常都是和某种具体的物理设备联系起来。键盘和显示器是计算机的标准输入输出设备,数据从键盘或磁盘文件流入内存的操作称为提取操作,数据从内存流向屏幕或磁盘文件称为插入操作。6n用cout进行输出 用cout进行输出时必须与预定义的插入符一起使用,输出时不用指定数据类型,系统自动按数据类型进行输出。#include void main()int i=10;float j=8.5;char*str=Windows!;cout i=i endl;cout j=j endl;cout str=str 一起使用,输入时不用指定数据类型,也可以使用多个提取符,将键盘输入的数据
3、送到输入流cin中,然后存到内存。#include void main()/*主函数*/int i1,i2,sum;/*变量定义*/cout i1 i2;/*输入数据*/sum=i1+i2;/*计算i1,i2的和*/cout sum=sum endl;/*输出sum的值*/81、重载的需要性n在C中,每个函数需要唯一的名字,例如,求两个数中较大的数,对于不同类型需要不同的名字:int imax(int,int);float fmax(float,float);double dmax(double,double);v函数的重载 9n函数的重载:即建立多个同名函数,但每个函数的参数个数或类型不同,
4、系统根据参数个数和类型决定调用哪个函数。例如,将上面三个函数的声明改为:int max(int,int);float max(float,float);double max(double,double);102、使用说明n仅返回类型不同,但函数名和形参都相同,则是非法的,如:int fun(int a,int b);long fun(int a,int b);n同名函数应该具有相同的功能,仅数据类型不同而已,否则可读性受破坏n当重载函数有默认参数时,应避免二义性nint fun(int a,int b=0);nint fun(int a);/error11【例9-1】参数类型上不同的重载函数#
5、includeint add(int,int);double add(double,double);void main()cout add(5,10)endl;cout add(5.6,10.2)endl;int add(int x,int y)return x+y;double add(double x,double y)return x+y;12【例9-2】参数个数上不同的重载函数#includeint min(int a,int b);int min(int a,int b,int c);void main()cout min(-2,8)endl;cout min(3,5,4)endl;
6、int min(int a,int b)return a b?a:b;int min(int a,int b,int c)int t=min(a,b);return min(t,c);13v带默认参数的函数n函数定义时给一个或多个参数指定默认值,调用时,如果省略参数,自动按默认值传递。1.默认参数的声明 (1)当有函数声明时void point(int x=3,int y=4);/声明中给出默认值void point(int x,int y)/定义中不允许给出默认值 coutxyendl;(2)没有函数声明时,在定义函数中给出默认值142.默认参数的顺序规定n默认参数必须是最右边的参数,即一个
7、指定了默认值参数的右边,不能出现没有指定的默认参数。void fun(int a=1,int b,int c=3);/errorvoid fun(int a,int b=2,int c=3);/ok15【例9-3】使用默认参数计算立方体体积#includeint volume(int length,int width=10,int height=20)void main()int l(50),w(40),h(30),area;area=volume(l,w,h);cout“The area of cube equal:t”areaendl;area=volume(l,w);cout“The a
8、rea of cube equal:t”areaendl;area=volume(l);cout“The area of cube equal:t”areaendl;int volume(int length,int width,int height)return length*width*height;16v内联函数n1.内联函数的需要性#include int isnumber(char);/函数声明void main()char c;while(c=cin.get()!=n)if(isnumber(c)/调用一个小函数 cout you entered a digitn;else cou
9、t=0&ch=0&ch=9)?1:0;3.内联函数的函数体限制:ninline用于经常用的小函数(15行)n内联函数内不能使用循环和开关语句n递归函数不能做内联函数18v一元作用域运算符(:)n用:在同名局部变量作用域中访问全局变量#include double n=5;int main()float n=8;cout Local float value of n=n nGlobal double value of n=:n endl;return 0;结果:结果:Local float value of n=8Global double value of n=519v引用与函数1.引用的概念
10、和定义n引用即别名,声明引用的过程就是给某个变量建立别名的过程。一般形式为:数据类型&引用名=变量名或 数据类型&引用名(变量名)例如:int a;int&ra=a;n说明:n引用一旦初始化,它就维系在一定的目标上不在分开n可以定义内部数据类型和包括结构体、类等的用户定义数据类型的引用,但不能定义数组的引用。由于声明引用不产生内部空间,所以不存在引用的引用。20n引用作为一个变量的别名实现对该变量的直接引用。n指针对其所指变量的引用是间接引用。n引用和指针的不同:引用只能对一个变量进行引用,指针可以在不同的时间指向不同的变量。因此在声明引用时要同时初始化。说明:引用与指针21【例9-4】声明和
11、使用引用#includevoid main()int num1=2;int&rNum=num1;coutnum1=num1endl;coutrNum=rNumendl;int num2=5;rNum=num2;coutnum1=num1endl;coutnum2=num2endl;coutrNum=rNumendl;cout&num1=&num1endl;cout&num2=&num2endl;cout&rNum=&rNumendl;运行结果运行结果:num1=2rNum=2num1=5num2=5rNum=5&num1=0 x0012FF7C&num2=0 x0012FF74&rNum=0
12、x0012FF7C222.引用作函数的参数【例9-5】用引用作函数参数。#include void squareByReference(int&);void main()int b(6);cout Before squareByReference:;cout b=b endl;squareByReference(b);cout After squareByReference:;cout b=b endl;void squareByReference(int&xRef)xRef*=xRef;不产生副本不产生副本与指针作参数的相同点和区别与指针作参数的相同点和区别23n用引用做函数的参数,该参数是
13、其对应实参的别名。在被调用函数中对形参的引用实际上就是直接引用了调用函数中的原始变量。传递引用与传递指针效果一样,不会在函数域内建立变量的副本,但传递指针是通过地址间接访问变量,而传递引用是通过别名直接访问变量。24例:使用引用返回多个值。#include void Factor(int,int&,int&);void main()int number,squared,cubed;cin number;Factor(number,squared,cubed);cout number“,”squared“,”cubed endl;void Factor(int n,int&rSquared,in
14、t&rCubed)rSquared=n*n;rCubed=n*n*n;25 3返回引用的函数函数返回引用时,直接将值返回给主调函数,不产生值的副本。#include float&fmax(float&x,float&y)/*函数参数和返回值都为引用*/return x y?x:y;void main()float a=3.5,b=2.6,max;max=fmax(a,b);/*函数调用直接将返回值赋给变量max*/cout max endl;269.2 面向对象程序设计方法v面向对象概念v类和对象 v面向对象程序设计的特性27v面向对象的概念1过程化程序设计:过程抽象n过程化编程的不足:n过程
15、化编程中数据和对数据进行处理的程序是分离的,导致程序的维护很困难。而对于大型程序,过程化方法无法保证将程序中该放在一起的内容放在一个单元中,从而导致维护数据与代码的协调一致性要花费大量的资源。n程序代码可重用性差。除了一些接口十分简单的标准库函数外,几乎每遇到一个问题,都要针对具体问题作大量重复又繁琐的工作。282面向对象程序设计:在数据抽象内部组织过程抽象n认识事物时应从“对象”入手,然后再转向“过程”。把现实世界的对象,抽象为程序中的对象,用对象的概念自然地进行思考,从而大大减小软件开发的难度。n在客观世界以及作为它的映射的软件系统中,“过程”和“操作”是不稳定的,而“对象”和“数据结构”
16、则相对稳定多了。以“对象”或以“数据结构”为中心,软件的主体结构相对稳定,软件的可重用性较好。n结构化程序设计是以函数函数为单位的,每个函数操作不同类型的数据。面向对象程序设计是以对象类对象类为单位的,每个类中包含了数据和对数据进行操作的函数。29v类和对象 q对象(Object)n人们通过观察对象的属性和行为来了解对象。对象的属性描述了对象的状态,对象的行为描述了对象的功能。对象一般有如下特性:n有一个名字以区别于其它对象;n有一些状态用来描述它的某些特征;n有一组操作,每个操作决定了对象的一种功能或行为。n例如:在学生学籍管理系统中,每个学生都可以看成一个对象。有一个学生名字叫张三,描述该
17、对象如下:30对象的属性:对象的属性:学号:学号:97001姓名:张三姓名:张三系别:物理系别:物理住址:住址:5号楼号楼选修学分:选修学分:26对象的行为:对象的行为:注册注册退学退学年级变更年级变更转系转系地址变更地址变更修改学分修改学分从实现机制看,从实现机制看,“对象对象”是具有特殊属性(数据)和行为方式是具有特殊属性(数据)和行为方式(方法)的封装体。(方法)的封装体。数据指对象数据结构的内容和值,方法指数据指对象数据结构的内容和值,方法指一系列实现的步骤,由若干操作构成。对象占有存储空间,具一系列实现的步骤,由若干操作构成。对象占有存储空间,具有传统语言的数据类型,给对象分配存储单
18、元即确定了给定时有传统语言的数据类型,给对象分配存储单元即确定了给定时刻该对象的状态,与每个对象相关的方法定义了该对象上的操刻该对象的状态,与每个对象相关的方法定义了该对象上的操作。作。31q消息(消息(Message)一个对象是独立存在的模块,通过消息激活机制可以把对一个对象是独立存在的模块,通过消息激活机制可以把对象动态连接起来。象动态连接起来。所谓消息指的是用来请求对象执行某一所谓消息指的是用来请求对象执行某一处理或回答某些信息的要求。处理或回答某些信息的要求。所谓发送消息,实际指的是所谓发送消息,实际指的是一次函数调用。一次函数调用。32class Studentprivate:cha
19、r name20;int age;public:void print()cout name age;void printname()cout name;void printage()coutage;class Courseprivate:char cname20;int roomno;public:void print()cout cname、输入输出数据。n面向对象程序以数据结构为中心,以类为单位进行编程。对象是类的实例,对象具有模块独立性,对象之间通过消息传递机制进行通信。n面向对象的另外两个重要特性就是提供继承层次结构和多态性。43思考题n面向对象程序设计的三个主要特征是什么?举例说明。n什么是抽象?44