第14章C-面向对象程序设计.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第14章C-面向对象程序设计.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14 面向 对象 程序设计
- 资源描述:
-
1、 C+面向对象程序设计面向对象程序设计 C语言具有许多优点,但是随着社会对软件需求的不断扩大、复杂性不断提高、规模日益增加,结构化的方法,就很难适应这种变化的需要。为了适应这种变化的需要,一种新的程序设计方法面向对象的程序设计方法被提出,当然面向过程的程序设计语言就不能满足这种新方法的需要。在20世纪80年代,在C语言基础上,增加了对面向对象程序设计方法的支持,形成带类的C,1983年正式命名为C+。C+面向对象程序设计面向对象程序设计在本章介绍的内容有:C+语言的特点由C向C+过渡面向对象的方法类与对象继承与派生多态性 14.1 C+的特点的特点特点:对C兼容、支持面向对象,但不是纯真面向对
2、象的语言,支持面向过程的结构化程序设计,又支持面向对象的程序设计不是高级的C,从概念上讲,是完全不同的计算机语言。14.2由由C向向C+过渡过渡 与类无关的C+语言的独特之处1、注释行 在C+中,除了用“/*”和“*/”括起来作为注释分界符号外,另一种更有效的注释方法就是使用“/”,从“/”开始直到它所在行的行尾,所有字符均被作为注释处理。如:/This is a example.int i;/i is a integer2).14.2由由C向向C+过渡过渡2、声明语句 在C+中,可以在任何需要的地方声明变量,但是我们不提倡这样,它不利于程序的维护。如:for(int i=0;i10;i+)i
3、nt length=5*i;14.2由由C向向C+过渡过渡3、C+的输入输出 1.I/O流流 在C中,printf和scanf是两个标准输入输出函数,在头文件stdio.h中声明。在C+面向对象程序设计中,将数据从一个对象到另一个对象的流动抽象为“流”。从流中获取的操作称为提取操作,向流中添加数据的操作称为插入操作。C+的输入输出是通过I/O流来实现的,cin和cout是预定义的流类对象,它们是在iostream.h中定义的。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即显示器输出。C+预定义的标准流如表14.1 14.2由由C向向C+过渡过渡3、C+的输入输出 1.I/O流
4、 流名流名 含义含义 默认设备默认设备cin 标准输入标准输入 键盘键盘cout 标准输标准输出出 显示器显示器cerr 标准出错输出标准出错输出 显示器显示器clog cerr的缓冲形式的缓冲形式 显显示器示器 14.2由由C向向C+过渡过渡3、C+的输入输出 2.预定义的插入符和提取符 当程序需要在屏幕上显示输出时,可以使用插入操作符“”向cout输出流中插入字符,格式如下:cout表达式1表达式2 例:cout“This is a program.n”;cout”a+b=”,从键盘取得数据送到输入流cin中,再到内存。格式如下:cin表达式1表达式2 例:int a,b;cinab;在输
5、入语句中,提取操作符可以连续多个,每一个后面跟一个表达式,该表达式一定是用来存放输入数据的变量。下面举一个完整的例:14.2由由C向向C+过渡过渡3、C+的输入输出 2.预定义的插入符和提取符【例141】从键盘输入两个数,找出最大值,显示最大值的平方根。#include#include void main()double a,b,c;cout a b;/处理键盘输入,即从cin流中取数据 c=ab?a:b;cout the squart of maximum=sqrt(c)y?x:y;return xy?x:y;14.2由由C向向C+过渡过渡5、任何函数调用之前必须有函数声明或定义 在C语言中
6、允许在调用函数前不声明或定义函数,例如:【例143】调用函数,输出两个数中的最大值#include int max(int x,in y)return xy?x:y;void main()int x=5,y=4,m;m=max(x,y);coutmendl;14.2由由C向向C+过渡过渡6、函数声明时形式参数不能省略 C+中函数声明时,形式参数不能省略,并且只能采用ANSI新标准推荐的现代方式声明。如果省略,则所声明的函数就是无形式参数的函数。但在C中函数声明时,形式参数是可以省略的。14.2由由C向向C+过渡过渡6、函数声明时形式参数不能省略【例144】调用函数,输出两个数中的最大值#inc
7、lude int max(int,int);void main()int x=5,y=4,m;m=max(x,y);coutmy?x:y;14.2由由C向向C+过渡过渡6、内联函数 为了有利于代码重用和提高软件开发效率,增强程序的可读性、可靠性和可维护性,在程序中,一般都使用函数,但是,使用函数也会降低程序的执行效率。因为在函数调用时,需要保护现场和返回地址,然后去执行子函数。子函数执行完后,又要取出保存的地址和现场状态,再继续执行。这些都需要时间和资源。14.2由由C向向C+过渡过渡6、内联函数 对于一些功能简单、程序规模小而又频繁使用的函数,可以设计为内联函数。内联函数与一般函数调用时不同
8、,而是在编译时将函数体嵌入在每一个调用语句处,这样就节省了时间和资源。内联函数在定义时使用关键字inline,格式有两种形式:1)、声明同时定义函数体inline 类型说明 函数名(含类型说明的形式参数);14.2由由C向向C+过渡过渡 2)、先声明后定义)、先声明后定义声明形式如下:声明形式如下:inline 类型说明类型说明 函数名(含类型说明的形式函数名(含类型说明的形式参数);参数);在程序的任何位置定义函数体,形式如下:在程序的任何位置定义函数体,形式如下:类型说明类型说明 函数名(含类型说明的形式参数)函数名(含类型说明的形式参数);在定义函数体时,不能再带有关键字在定义函数体时,
9、不能再带有关键字inline。14.2由C向C+过渡 注意:使用内联函数应注意以下两点:(1)、内联函数体内不能有循环语句和switch语句;(2)、内联函数必须在第一次调用前声明或定义。对于复杂和规模大的函数,尽管使用频繁,也不要写成内联函数的形式,这样会增加程序的规模。例如:14.2由C向C+过渡【例145】内联函数的声明、定义与调用#include inline int isnumber(char);/函数声明void main()char c;while(c=cin.get()!=n)/接收输入 if(isnumber(c)/调用内联函数,并判定函数返回值 cout you enter
10、ed a digitn;/函数返回值为1 else cout=0&ch=9)?1:0;14.2由C向C+过渡14.2.8带默认形参值的函数 函数在定义时可以预先定义一个默认的形参值。在函数调用时,如果给出实参,则用实参初始化形参;如果没有给出实参,就用预先给定的默认值。例如:14.2由C向C+过渡【例146】带默认形参值的函数的声明与定义#include int add(int a=5,int b=9)/形参a与b的默认值分别为5和9return a+b;/两数相加void main()add(15,20);/用实参初始化形参,实现15+20add(15);/形参a用15,b用默认值9,返回值
11、为24add();/a、b都用默认值,返回值为14 14.2由C向C+过渡注意:1)、如果定义某个形式参数带有默认值,则必须定义所有后续形式参数也带有默认值,即在有默认值参数的右面,不能出现无默认值的形参。例如:void ShowMessage(char*Text,int Length=-1,int Color);此函数定义为错,应定义为:void ShowMessage(char*Text,int Length=-1,int Color=0);14.2由C向C+过渡2)、调用函数时省略带有默认参数,则必须省略该参数所有后续参数【例147】#include void point(int x=5
12、,int y=6,int z=7);/函数声明void main()cout显示默认参数:endl;point();/省略 14.2由C向C+过渡所有参数利用默认值cout第二、三参数用默认值endl;point(10);/省略第二、三参数利用默认值cout第三参数用默认值endl;point(10,9);/省略第三参数利用默认值cout三个参数用实参传递的值endl;point(10,9,8);/利用实参的值 14.2由C向C+过渡void point(int x,int y,int z)/函数定义 coutx=xendl;/输出x couty=yendl;/输出y coutz=zendl;
13、/输出z运行结果为:图14.1 程序运行结果 14.2由C向C+过渡3)、如果是先声明后定义函数,则在声明时给出)、如果是先声明后定义函数,则在声明时给出默认值,在定义时就不能给出默认值,否则出错默认值,在定义时就不能给出默认值,否则出错。14.2由C向C+过渡14.2.9函数的重载函数的重载 在C语言中,函数名不能相同,如果相同,就出错,但在C+中,提供了对重载的支持。所谓重载,就是在程序中相同的函数名对应不同的函数实现。函数重载允许程序内多个名称相同的函数,这些函数可以完成不同的功能,并且带有不同的类型、不同的形参个数及不同的返回值。14.2由C向C+过渡使用函数重载,就可以把功能相似的函
14、数名命名为一个相同的标示符,减轻程序员对于函数的记忆负担,使程序结构简单、易懂。例如:【例148】求各种不同数据类型的和#include 14.2由C向C+过渡/函数声明 int add(int,int);/两个整数相加 int add(int,int,int);/三个整数相加 double add(double,double);/两个浮点数相加 double add(double,double,double);/三个浮点数相加void main()cout求整数5、6的和add(5,6)endl;cout求整数5、6、7的和add(5,6,7)endl;cout求浮点数4.2、5.9的和ad
15、d(4.2,5.9)endl;cout求浮点数4.2、5.9、9.3的和add(4.2,5.9,9.3)endl;14.2由C向C+过渡/函数定义int add(int x,int y)/两个整数相加return x+y;int add(int x,int y,int z)/三个整数相加 return x+y+z;double add(double x,double y)/两个浮点数相加 return x+y;double add(double x,double y,double z)/三个浮点数相加 return x+y+z;14.2由C向C+过渡图14.2 程序运行结果 14.2由C向C+
16、过渡提示:函数的重载要求编译器能够唯一地确定应该调用的函数,即应该采用哪一个函数来实现。为了不造成混乱,则要求重载函数的形参数个数或形参数的类型或形参的排列顺序不同。也就是说,函数重载,函数名可以相同,但函数形参的个数或类型或排列顺序不能相同。14.2由C向C+过渡14.2.10作用域操作符作用域操作符 作用域是一个标示符在程序中的作用范围。当局部变量与全局变量同名时,局部变量掩盖全局变量。但在有时需要操作与局部变量同名的全局变量时,就可以用作用域操作符“:”来访问全局变量,格式是在全局变量名前加作用域操作符。14.2由C向C+过渡例如:【例149】作用域操作符的使用double A;/全局变
17、量Avoid main()int A;/局部变量A A=5;/为局部变量A赋值 :A=2.5;/为全局变量A赋值 coutAendl;/输出局部变量的值5 cout:Aendl;/输出全局变量的值2.5 14.2由C向C+过渡14.2.11 new和和delete操作符操作符 在编写程序时,常常需要动态分配和释放内存空间,在C语言中是利用库函数malloc()和free()函数来实现的。但是malloc函数需要预先知道应该分配的内存空间的大小,其调用形式为malloc(size),这里的size是分配的字节数。可以给定具体数,也可以用sizeof运算来测定。同时其返回值为void型,需要进行强
18、制类型转化,才能得到所需要的指针指向的类型。14.2由C向C+过渡 在C+中,提供了功能更强大的运算符new与delete,不需头文件,new比malloc()更简练,new操作符自动确定对象的正确长度并返回正确类型指针。使用类对象时,new自动调用类的构造函数,delete自动调用类的析构函数。关于类对象、类构造函数、类析构函数在后面讲解。14.2由C向C+过渡例如:int*i;/定义一个指向整型的指针i=new int;/分配一个存储整型数据的空间,返回一个指向整型数据的指针i=new int(50);/分配一个存储整型数据的空间,返回一个指向整型数据的指针,并赋初值为50。i=new i
19、nt10;/分配一个长度为10的一维整型数组的空间,返回一个指向整型数组的指针,以后i就象int i10一样,来使用i。但是这里是动态分配的空间,当然在用完以后,可以撤消动态分配的空间,而int i10,所分配的空间是静态的。14.2由C向C+过渡用new分配空间的格式是:1)、先定义指针变量,再分配存储空间指针变量=new 类型(初值)如:float*f;f=new float;/不给初值或f=new float(3.14159);/给初值再如:char*ch;ch=new char;/分配一个存储字符数据的空间,返回一个指向字符数据的指针。或ch=new char50;/分配一个长度为10
20、的一维字符数组的空间,返回一个指向字符数组的指针 14.2由C向C+过渡2)、在定义指针变量的同时分配存储空间例如:float*f=new float;/不给初值或float*f=new float(3.14159);/给初值再如:char*ch=new char;/分配一个存储字符数据的空间,返回一个指向字符数据的指针。或char*ch=new char50;/分配一个长度为10的一维字符数组的空间,返回一个指向字符数组的指针 14.2由C向C+过渡用delete运算符释放用new分配的存储空间,其格式为:delete 被释放指针变量;如:delete i;delete ch;但是delet
21、e 释放的是数组时,应该在指针变量前带“”,以示要回收的是数组而不是单个基本类型对象。14.2由C向C+过渡例如:delete i;/释放的是数组delete ch;/释放的是一个数组例如:【例1410】new和delete运算符的使用#include struct student/定义结构体int num;/学号 char name20;/姓名 char sex;/性别 int age;/年龄;14.2由C向C+过渡void main()student*stu1;/定义一个指向结构体的指针stu1=new student;/利用操作符为指针变量分配存储空间stu1-num=20;/赋值str
22、cpy(stu1-name,”Xiao Qing”);/赋值stu1-sex=F;/赋值stu1-age=18;/赋值delete stu1;/释放存储空间 14.2由C向C+过渡 先声明了一个结构体类型student,在主函数中定义了一个指向student类型的指针变量stu1,用new分配用于存储student类型数据的存储空间,空间的大小由系统根据student的自己确定,返回一个指向student类型的指针,存储在stu1中,然后就是给结构体的成员变量赋值。最后用delete运算符,释放被分配的存储空间。提示:当用new分配存储空间失败时,返回的是一个空指针NULL,可以用来判断分配存
23、储空间是否成功。new与delete是运算符,成对使用,而malloc与free是一对函数,在C+中,保持了对这对函数的支持。14.3 面向对象的方法14.3.1 面向对象的语言面向对象的程序设计语言与面向过程的程序设计面向对象的程序设计语言与面向过程的程序设计语言的根本不同点在于:它设计的出发点不再语言的根本不同点在于:它设计的出发点不再是按照功能分解的方式来划分模块,而是以客是按照功能分解的方式来划分模块,而是以客观世界中存在的事物(即对象)为研究对象,观世界中存在的事物(即对象)为研究对象,研究对象的属性、行为以及对象之间相互作用研究对象的属性、行为以及对象之间相互作用的关系。的关系。面
24、向对象的程序设计语言经历了一个很长的发展面向对象的程序设计语言经历了一个很长的发展过程,应用最广的面向对象的语言是由过程,应用最广的面向对象的语言是由C语言发语言发展而来的展而来的C+语言,由于它对语言,由于它对C语言的兼容,而语言的兼容,而C语言已经被人们所熟悉,有语言已经被人们所熟悉,有C作为基础学习作为基础学习C+就有得天独厚的条件。就有得天独厚的条件。14.3 面向对象的方法14.3.2 面向对象方法 面向对象方法的出发点,就是模拟人类的认识事物解决问题的过程来开发软件,这是学习和理解面向对象方法的关键。面向对象方法中提到的“对象”,是软件开发者根据自己的研究范畴来定义或选取。对象通过
25、抽象,找出同一类对象的共同属性和行为,形成类,如抽象汽车和火车的共同属性和行为,忽略其差异,形成“车”这个类。通过类的继承、多态就可以实现代码的重用,提高程序开发效率,缩短开发周期。14.4 类与对象 在面向对象的程序设计中,程序的模块是由类构成的,类是数据和函数的封装体,是对所要处理的问题的抽象描述。类实际上相当于是用户自定义的数据类型,就象在C语言中的结构体一样,不同的是结构体中没有对数据的操作,类中封装了对数据的操作(在C+中结构体中也可以有对数据操作的函数,但与类的操作有区别),可以利用自定义的类型来定义变量,这个变量就称为类的对象(或实例),声明的过程称为类的实例化。14.4 类与对
展开阅读全文