《C语言从结构化程序设计到面向对象.ppt》由会员分享,可在线阅读,更多相关《C语言从结构化程序设计到面向对象.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9章章 从结构化程序从结构化程序设计到面向对象的程设计到面向对象的程序设计序设计 北京交通大学计算机学院北京交通大学计算机学院计算机程序设计基础课程组计算机程序设计基础课程组1教学目标教学目标v了解了解C+对对C的扩充和改进的扩充和改进v掌握面向对象程序设计的基本思想和方法掌握面向对象程序设计的基本思想和方法v掌握面向对象的概念掌握面向对象的概念v理解面向对象程序设计的特性理解面向对象程序设计的特性29.1 C+对对C的改进和扩充的改进和扩充 9.2 面向对象程序设计方法面向对象程序设计方法9.2.1 面向对象概念面向对象概念9.2.2 类和对象类和对象 9.2.3 面向对象程序设计的特性
2、面向对象程序设计的特性39.1.1 输入输出流输入输出流vscanf和和printf输入输出的缺陷输入输出的缺陷v输入输出流的概念:输入输出流的概念:输入输出是以字节流的形式实现的,流实际上是一个字节输入输出是以字节流的形式实现的,流实际上是一个字节序列。序列。在输入操作中,字节从输入设备流向内存;输出操作中,在输入操作中,字节从输入设备流向内存;输出操作中,字节从内存流向输出设备。字节从内存流向输出设备。流是一个抽象的概念,实际进行输入输出时,流通常都是流是一个抽象的概念,实际进行输入输出时,流通常都是和某种具体的物理设备联系起来。键盘和显示器是计算机和某种具体的物理设备联系起来。键盘和显示
3、器是计算机的标准输入输出设备,数据从键盘或磁盘文件流入内存的的标准输入输出设备,数据从键盘或磁盘文件流入内存的操作称为提取操作,数据从内存流向屏幕或磁盘文件称为操作称为提取操作,数据从内存流向屏幕或磁盘文件称为插入操作。插入操作。9.1 C+对对C的改进和扩充的改进和扩充4v用用cout进行输出进行输出 用用cout进行输出时必须与预定义的插入符进行输出时必须与预定义的插入符一起使用,输一起使用,输出时不用指定数据类型,系统自动按数据类型进行输出。出时不用指定数据类型,系统自动按数据类型进行输出。#includevoid main()int i=10;float j=8.5;char*str=
4、Windows!;cout i=i endl;cout j=j endl;cout str=str 一起使用,输一起使用,输入时不用指定数据类型,也可以使用多个提取符,将键盘入时不用指定数据类型,也可以使用多个提取符,将键盘输入的数据送到输入流输入的数据送到输入流cin中,然后存到内存。中,然后存到内存。#includevoid main()/*主函数主函数*/int i1,i2,sum;/*变量定义变量定义*/cout i1 i2;/*输入数据输入数据*/sum=i1+i2;/*计算计算i1,i2的和的和*/cout sum=sum endl;/*输出输出sum的值的值*/9.1 C+对对C
5、的改进和扩充的改进和扩充61、重载的需要性、重载的需要性v在在C中,每个函数需要唯一的名字,例如,求两个数中较大的中,每个函数需要唯一的名字,例如,求两个数中较大的数,对于不同类型需要不同的名字:数,对于不同类型需要不同的名字:int imax(int,int);float fmax(float,float);double dmax(double,double);v函数的重载:即建立多个同名函数,但每个函数的参数个数函数的重载:即建立多个同名函数,但每个函数的参数个数或类型不同,系统根据参数个数和类型决定调用哪个函数。或类型不同,系统根据参数个数和类型决定调用哪个函数。例如,将上面三个函数的声
6、明改为:例如,将上面三个函数的声明改为:int max(int,int);float max(float,float);double max(double,double);9.1 C+对对C的改进和扩充的改进和扩充9.1.2 函数的重载函数的重载 72、使用说明、使用说明仅返回类型不同,但函数名和形参都相同,则是非法的,仅返回类型不同,但函数名和形参都相同,则是非法的,如:如:int fun(int a,int b);long fun(int a,int b);同名函数应该具有相同的功能,仅数据类型不同而已,同名函数应该具有相同的功能,仅数据类型不同而已,否则可读性受破坏否则可读性受破坏当重载
7、函数有默认参数时,应避免二义性当重载函数有默认参数时,应避免二义性vint fun(int a,b=0);vint fun(int a);v/error9.1 C+对对C的改进和扩充的改进和扩充8【例【例9-4】参数类型上不同的重载函数】参数类型上不同的重载函数#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)retur
8、n x+y;9.1 C+对对C的改进和扩充的改进和扩充9【例【例9-5】参数个数上不同的重载函数】参数个数上不同的重载函数#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;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);9.1 C+对对C的改进和扩充的改进和扩充109.1.3 带默认参数的函数带默认参
9、数的函数v函数定义时给一个或多个参数指定默认值,调用时,如果省函数定义时给一个或多个参数指定默认值,调用时,如果省略参数,自动按默认值传递。略参数,自动按默认值传递。1.默认参数的声明默认参数的声明 (1)当有函数声明时当有函数声明时void point(int x=3,int y=4)/声明中给出默认值声明中给出默认值void point(int x,int y)/定义中不允许给出默认值定义中不允许给出默认值 coutxyendl;(2)没有函数声明时,在定义函数中给出默认值没有函数声明时,在定义函数中给出默认值2.默认参数的顺序规定默认参数的顺序规定v默认参数必须是最右边的参数,即一个指定
10、了默认值参数的默认参数必须是最右边的参数,即一个指定了默认值参数的右边,不能出现没有指定的默认参数。右边,不能出现没有指定的默认参数。void fun(int a=1,int b,int c=3);/errorvoid fun(int a,int b=2,int c=3);/ok9.1 C+对对C的改进和扩充的改进和扩充11【例【例9-6】使用默认参数计算立方体体积使用默认参数计算立方体体积#includeint volume(int length,int width=10,int height=20)void main()int l(50),w(40),h(30),area;area=vol
11、ume(l,w,h);cout“The area of cube equal:t”areaendl;area=volume(l,w);cout“The area 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;129.1.4 内联函数内联函数v1.内联函数的需要性内联函数的需要性#include int isnumber(char);/函数声明函数
12、声明void main()char c;while(c=cin.get()!=n)if(isnumber(c)/调用一个小函数调用一个小函数 cout you entered a digitn;else cout=0&ch=0&ch=9)?1:0;3.内联函数的函数体限制:内联函数的函数体限制:inline用于经常用的小函数(用于经常用的小函数(15行)行)内联函数内不能使用循环和开关语句内联函数内不能使用循环和开关语句递归函数不能做内联函数递归函数不能做内联函数9.1 C+对对C的改进和扩充的改进和扩充149.1.5 一元作用域运算符(一元作用域运算符(:)v用用:在同名局部变量作用域中访问
13、全局变量在同名局部变量作用域中访问全局变量#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=59.1 C+对对C的改进和扩充的改进和扩充159.1.6 引用与函数引用与函数1.引用的概念引用的概念v引用是别名,声明引用的过程就是给某个变量建立别名引用是别名,声明引用的过程就是给某个变量建立别名的过程。一般形式为:
14、的过程。一般形式为:数据类型数据类型&引用名引用名=变量名变量名或或 数据类型数据类型&引用名(变量名)引用名(变量名)例如:例如:int a;int&ra=a;v说明:说明:程序找引用的地址,只能找到所引用目标的地址程序找引用的地址,只能找到所引用目标的地址引用一旦初始化,它就维系在一定的目标上不在分开引用一旦初始化,它就维系在一定的目标上不在分开9.1 C+对对C的改进和扩充的改进和扩充16【例【例9-7】声明和使用引用声明和使用引用#includevoid main()int num1=2;int&rNum=num1;coutnum1=num1endl;coutrNum=rNumendl
15、;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 x0012FF7C9.1 C+对对C的改进和扩充的改进和扩充172.引用作函数的参数引用作函数的参数【例【例9-8】用引用作函数参数。】用引用作函数参数。#inclu
16、devoid squareByReference(int&);void main()int a(5),b(6);cout Before squareByReference:;cout b=b endl;squareByReference(b);cout After squareByReference:;cout b=b endl;void squareByReference(int&xRef)xRef*=xRef;9.1 C+对对C的改进和扩充的改进和扩充不产生副本不产生副本与指针作参数的相同点和区别与指针作参数的相同点和区别18例:使用引用返回多个值。例:使用引用返回多个值。#include
17、 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,int&rCubed)rSquared=n*n;rCubed=n*n*n;9.1 C+对对C的改进和扩充的改进和扩充193返回引用的函数返回引用的函数v函数返回引用时,直接将值返回给主调函数,不产生值的副本。函数返回引用时,直接将值返回给主调函数,不产生值的副
18、本。#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;9.1 C+对对C的改进和扩充的改进和扩充209.2.1 面向对象的概念面向对象的概念1过程化程序设计:过程抽象过程化程序设计:过程抽象v过程化编程的不足:过程化编程的不足:过程化编程中数据和对数据进行处理的程序是分离的,过程化编程中数据和对数据
19、进行处理的程序是分离的,导致程序的维护很困难。而对于大型程序,过程化方导致程序的维护很困难。而对于大型程序,过程化方法无法保证将程序中该放在一起的内容放在一个单元法无法保证将程序中该放在一起的内容放在一个单元中,从而导致维护数据与代码的协调一致性要花费大中,从而导致维护数据与代码的协调一致性要花费大量的资源。量的资源。程序代码可重用性差。除了一些接口十分简单的标准程序代码可重用性差。除了一些接口十分简单的标准库函数外,几乎每遇到一个问题,都要针对具体问题库函数外,几乎每遇到一个问题,都要针对具体问题作大量重复又繁琐的工作。作大量重复又繁琐的工作。9.2 面向对象的程序设计方法面向对象的程序设计
20、方法 212面向对象程序设计:在数据抽象内部组织过程抽象面向对象程序设计:在数据抽象内部组织过程抽象认识事物时应从认识事物时应从“对象对象”入手,然后再转向入手,然后再转向“过程过程”。把。把现实世界的对象,抽象为程序中的对象,用对象的概念自现实世界的对象,抽象为程序中的对象,用对象的概念自然地进行思考,从而大大减小软件开发的难度。然地进行思考,从而大大减小软件开发的难度。在客观世界以及作为它的映射的软件系统中,在客观世界以及作为它的映射的软件系统中,“过程过程”和和“操作操作”是不稳定的,而是不稳定的,而“对象对象”和和“数据结构数据结构”则相对则相对稳定多了。以稳定多了。以“对象对象”或以
21、或以“数据结构数据结构”为中心,软件的为中心,软件的主体结构相对稳定,软件的可重用性较好。主体结构相对稳定,软件的可重用性较好。结构化程序设计是以函数为单位的,每个函数操作不同类结构化程序设计是以函数为单位的,每个函数操作不同类型的数据。面向对象程序设计是以对象类为单位的,每个型的数据。面向对象程序设计是以对象类为单位的,每个类中包含了数据和对数据进行操作的函数。类中包含了数据和对数据进行操作的函数。9.2 面向对象的程序设计方法面向对象的程序设计方法 229.2.2 类和对象类和对象 1对象(对象(Object)客观世界中对象无处不在,人、汽车、房子、计算机、球等客观世界中对象无处不在,人、
22、汽车、房子、计算机、球等都是对象,人们通过对象来思考问题,具有较高的抽象能力。都是对象,人们通过对象来思考问题,具有较高的抽象能力。如我们能看到的是房子这个对象而不是一块块砖。这些对象如我们能看到的是房子这个对象而不是一块块砖。这些对象都有一些共同的地方,即都有颜色、尺寸、重量、形状等属都有一些共同的地方,即都有颜色、尺寸、重量、形状等属性(性(attribute),并具有一些行为(并具有一些行为(behavior),如人能走路、),如人能走路、说话、眨眼;汽车能加速、刹车、转向等。说话、眨眼;汽车能加速、刹车、转向等。人们通过观察对象的属性和行为来了解对象。对象的属性描人们通过观察对象的属性
23、和行为来了解对象。对象的属性描述了对象的状态,对象的行为描述了对象的功能。对象一般述了对象的状态,对象的行为描述了对象的功能。对象一般有如下特性:有如下特性:v有一个名字以区别于其它对象;有一个名字以区别于其它对象;v有一些状态用来描述它的某些特征;有一些状态用来描述它的某些特征;v有一组操作,每个操作决定了对象的一种功能或行为。有一组操作,每个操作决定了对象的一种功能或行为。9.2 面向对象的程序设计方法面向对象的程序设计方法 23v例如在学生学籍管理系统中,每个学生都可以看成一个对例如在学生学籍管理系统中,每个学生都可以看成一个对象。有一个学生名字叫张三,描述该对象如下:象。有一个学生名字
24、叫张三,描述该对象如下:9.2 面向对象的程序设计方法面向对象的程序设计方法 对象的状态:对象的状态:学号:学号:97001姓名:张三姓名:张三系别:物理系别:物理住址:住址:5号号楼楼选修学分:选修学分:26对象的行为:对象的行为:注册注册退学退学年级变更年级变更转系转系地址变更地址变更修改学分修改学分v从实现机制看,从实现机制看,“对象对象”是具有特殊属性(是具有特殊属性(状态状态)和行为方)和行为方式(式(方法方法)的封装体。状态指对象数据结构的内容和值,方法)的封装体。状态指对象数据结构的内容和值,方法指一系列实现的步骤,由若干操作构成。对象占有存储空间,指一系列实现的步骤,由若干操作
25、构成。对象占有存储空间,具有传统语言的数据类型,给对象分配存储单元即确定了给定具有传统语言的数据类型,给对象分配存储单元即确定了给定时刻该对象的状态,与每个对象相关的方法定义了该对象上的时刻该对象的状态,与每个对象相关的方法定义了该对象上的操作。操作。24class student char name20;public:void print()cout name void printname()cout name;class course char cname20;public:void print()cout、输入输出数输入输出数据。据。v面向对象程序以数据结构为中心,以类为单位进行编程。面向对象程序以数据结构为中心,以类为单位进行编程。对象是类的实例,对象具有模块独立性,对象之间通过对象是类的实例,对象具有模块独立性,对象之间通过消息传递机制进行通信。消息传递机制进行通信。v面向对象的另外两个重要特性就是提供继承层次结构和面向对象的另外两个重要特性就是提供继承层次结构和多态性。多态性。9.3 本章小结本章小结 33思考题思考题v面向对象程序设计的三个主要特征是什么?举例说面向对象程序设计的三个主要特征是什么?举例说明。明。v什么是抽象?什么是抽象?34