C语言从结构化程序设计到面向对象.ppt_第1页
C语言从结构化程序设计到面向对象.ppt_第2页
C语言从结构化程序设计到面向对象.ppt_第3页
C语言从结构化程序设计到面向对象.ppt_第4页
C语言从结构化程序设计到面向对象.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第9章 从结构化程序设计到面向对象的程序设计,北京交通大学计算机学院 计算机程序设计基础课程组,2,教学目标,了解C+对C的扩充和改进 掌握面向对象程序设计的基本思想和方法 掌握面向对象的概念 理解面向对象程序设计的特性,3,9.1 C+对C的改进和扩充 9.2 面向对象程序设计方法 9.2.1 面向对象概念 9.2.2 类和对象 9.2.3 面向对象程序设计的特性,4,9.1.1 输入输出流,scanf和printf输入输出的缺陷 输入输出流的概念: 输入输出是以字节流的形式实现的,流实际上是一个字节序列。 在输入操作中,字节从输入设备流向内存;输出操作中,字节从内存流向输出设备。 流是

2、一个抽象的概念,实际进行输入输出时,流通常都是和某种具体的物理设备联系起来。键盘和显示器是计算机的标准输入输出设备,数据从键盘或磁盘文件流入内存的操作称为提取操作,数据从内存流向屏幕或磁盘文件称为插入操作。,9.1 C+对C的改进和扩充,5,用cout进行输出 用cout进行输出时必须与预定义的插入符 void main() int i = 10; float j = 8.5; char *str = Windows!; cout i= i endl; cout j= j endl; cout str= str endl; ,9.1 C+对C的改进和扩充,6,用cin进行输入 用cin进行输入

3、时必须与预定义的提取符一起使用,输入时不用指定数据类型,也可以使用多个提取符,将键盘输入的数据送到输入流cin中,然后存到内存。 #include void main() /*主函数*/ int i1 , i2 , sum; /*变量定义*/ cout i1 i2; /*输入数据*/ sum = i1 + i2; /*计算i1,i2的和*/ cout sum= sum endl; /*输出sum的值*/ ,9.1 C+对C的改进和扩充,7,1、重载的需要性 在C中,每个函数需要唯一的名字,例如,求两个数中较大的数,对于不同类型需要不同的名字: int imax(int ,int ); floa

4、t fmax(float,float); double dmax(double,double); 函数的重载:即建立多个同名函数,但每个函数的参数个数或类型不同,系统根据参数个数和类型决定调用哪个函数。例如,将上面三个函数的声明改为: int max(int ,int ); float max(float,float); double max(double,double);,9.1 C+对C的改进和扩充,9.1.2 函数的重载,8,2、使用说明 仅返回类型不同,但函数名和形参都相同,则是非法的,如: int fun(int a,int b); long fun(int a,int b); 同名

5、函数应该具有相同的功能,仅数据类型不同而已,否则可读性受破坏 当重载函数有默认参数时,应避免二义性 int fun(int a,b=0); int fun(int a); /error,9.1 C+对C的改进和扩充,9,【例9-4】参数类型上不同的重载函数 #include int 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

6、(double x , double y) return x + y; ,9.1 C+对C的改进和扩充,10,【例9-5】参数个数上不同的重载函数 #include int 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

7、 , b ); return min( t , c ); ,9.1 C+对C的改进和扩充,11,9.1.3 带默认参数的函数,函数定义时给一个或多个参数指定默认值,调用时,如果省略参数,自动按默认值传递。 1. 默认参数的声明 (1)当有函数声明时 void point(int x=3,int y=4) /声明中给出默认值 void point(int x,int y) /定义中不允许给出默认值 coutxyendl; (2)没有函数声明时,在定义函数中给出默认值 2. 默认参数的顺序规定 默认参数必须是最右边的参数,即一个指定了默认值参数的右边,不能出现没有指定的默认参数。 void fun

8、(int a=1,int b,int c=3); /error void fun(int a,int b=2,int c=3); /ok,9.1 C+对C的改进和扩充,12,【例9-6】 使用默认参数计算立方体体积 #include int 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 area o

9、f 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; ,13,9.1.4 内联函数,1.内联函数的需要性 #include int isnumber(char); /函数声明 void main() char c; while(c=cin.get()!=n) if( isnumber(c) ) /调用一个小函数 cout =0 ,9.1 C+对C

10、的改进和扩充,14,2. 解决办法 限定符inline用于函数定义,称为内联函数。将isnumber()函数声明为inline,即在函数声明和定义中: inline int isnumber(char); /inline不能少 void main() / inline int isnumber(char c) return (ch=0 3.内联函数的函数体限制: inline用于经常用的小函数(15行) 内联函数内不能使用循环和开关语句 递归函数不能做内联函数,9.1 C+对C的改进和扩充,15,9.1.5 一元作用域运算符(:),用:在同名局部变量作用域中访问全局变量 #include do

11、uble 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 = 8 Global double value of n =5,9.1 C+对C的改进和扩充,16,9.1.6 引用与函数,1. 引用的概念 引用是别名,声明引用的过程就是给某个变量建立别名的过程。一般形式为: 数据类型 说明: 程序找引用的地址,只能找到所引用目标的地址 引用一旦初始化,它就维系在一定的目标上不在分开,

12、9.1 C+对C的改进和扩充,17,【例9-7】 声明和使用引用 #include void main() int num1 = 2; int ,运行结果: num1=2 rNum=2 num1=5 num2=5 rNum=5 public: void print() cout name void printname() cout name; ; class course char cname20; public: void print() cout cname ;,void f1(student P) P.printname(); P.print(); /向同一个对象发送不同的消息 void

13、 f2(student P,course C) P.print(); C.print(); /向不同对象发送相同的消息 ,9.2 面向对象的程序设计方法,2消息(Message) 一个对象是独立存在的模块,通过消息激活机制可以把对象动态连接起来。所谓消息指的是用来请求对象执行某一处理或回答某些信息的要求。所谓发送消息,实际指的是一次函数调用。,26,9.2 面向对象的程序设计方法,3类(Class) 类是对一组对象的抽象,它将该组对象具有的共同特征集中起来,以说明该组对象的能力和性质。因此,具有相似的属性和行为的一组对象就可以抽象为类。 例如,学籍管理系统中,张三和李四都是学生对象,都有学号、

14、姓名、系别、住址、选修学分等属性,都能将进行注册、退学、年级变更、转系、地址变更和修改学分等操作,因此,可以将所有同学抽象为一个类学生类。 类是所有具有共同特征的对象的抽象,是一个抽象的概念;而对象是一个类中某个具体的实体,称为类的实例(Instance)。类和实例的关系,是抽象和具体的关系,对象是程序执行过程中由所属的类动态生成的。,27,9.2 面向对象的程序设计方法,例如,定义学生类如下: 对象类:学生(Student) 属性:学号(StudentNo) 姓名(Name) 系别(Department) 住址(Address) 选修学分(Credit) 方法:注册(Enroll) 退学(D

15、rop) 年级变更(ChangeLevel) 转系(ChangeDept) 地址变更 (ChangeAddress) 修改学分(ChangeCredit),28,9.2.3 面向对象程序设计特性,1.封装和数据隐藏(Encapsulation) 封装是一种信息隐蔽技术,指的是将一个数据和与这个数据有关的操作集合放在一起形成对象,用户只能见到对象封装界面上的信息,对象内部对用户是隐蔽的。 封装的目的:将设计者和使用者分开。使用者不必知道对象行为的细节,只需要使用设计者提供的协议命令对象去做即可。 私有数据修改的方法:数据隐藏技术使对象内部的属性只能由该对象自己的方法进行修改,外界不能访问,外界只

16、能通过对象提供的接口去访问这些属性,从而有效避免外界的错误对该对象的影响。,9.2 面向对象的程序设计方法,29,2继承性(Inheritance) 如果有几个类有公共的属性或方法,最好创建一个包含这些公共内容的新类来避免重复,归类的结果是逐步抽象的过程;反之,对于复杂的类最好划分为几个更特殊的类,层层分类,是概念逐步细化的过程。 面向对象程序设计中允许用已有的类通过继承的方式创建新类,继承性是自动地共享类、子类和对象中的方法和数据的机制。新类称为派生类(dervied class)或子类(subclass),已有类称为基类(base class)或父类(superclass),子类继承父类的

17、全部方法和属性。,9.2 面向对象的程序设计方法,30,例如,要定义一个新类研究生类,由于研究生也是学生,具有Student的全部属性,还有Student类没有的导师等属性,可以根据已有的Student类派生。 对象类:研究生(Graduate) 父类:学生(Student) 属性: 学位(Program) 导师(Advisor) 在职否(Occupation) 方法: 学位变更(ChangeProgram) 导师变更(ChangeAdvisor) 状态变更 (ChangeOccupation),9.2 面向对象的程序设计方法,31,继承是可以传递的,继承可以使我们用一种简单的方法描述事物。下

18、面是鱼类的继承层次结构:,9.2 面向对象的程序设计方法,32,3多态性(Polymorphism) 多态性:指发出同样的消息被不同类型的对象接收时导致完全不同的行为。发送消息即函数调用,不同的行为指不同的实现。在多个类中可能会存在一些名字相同,但实现过程和功能不同的方法,如: void f2(student P,course C) P.print(); C.print(); /向不同对象发送相同的消息 P.print()向对象P发送了一个print()消息,结果调用Student类的print()函数打印出学生的名字。C.print()向对象C发送了一个print()消息,结果调用Course类的print()函数打印出课程的名字。同样一个消息print(),被不同

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论