《面向对象技术与_c--》网上直播1课件

PPT
  • 阅读 41 次
  • 下载 0 次
  • 页数 72 页
  • 大小 194.500 KB
  • 2022-12-01 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
《面向对象技术与_c--》网上直播1课件
可在后台配置第一页与第二页中间广告代码
《面向对象技术与_c--》网上直播1课件
可在后台配置第二页与第三页中间广告代码
《面向对象技术与_c--》网上直播1课件
可在后台配置第三页与第四页中间广告代码
《面向对象技术与_c--》网上直播1课件
《面向对象技术与_c--》网上直播1课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 72
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】《面向对象技术与_c--》网上直播1课件.ppt,共(72)页,194.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-77148.html

以下为本文档部分文字说明:

华东师大网络学院计算机专业《面向对象技术及C++》网上直播(1)2002-2010Lu.Allrightsreserved.No.2基本要求2002-2010Lu.Allrightsreserved.No.3课程性质与目的

•课程性质《面向对象技术及C++》课程是计算机科学与应用专业的一门基础专业课程,C++是一种高级程序设计语言,主要体现面向对象程序设计的特色。•课程设置目的该课程主要介绍应用C++语言进行程序设计的基本原理与基本方法,通过课程学习和上机实习,培养学员使用

C++语言进行程序设计的能力和实际系统开发的能力,为其它课程的学习和从事应用开发工作打下坚实基础,特别为进行面向对象的系统开发和窗口程序设计打下基础。2002-2010Lu.Allrightsreserved.No.4教学内容与要求•第1章把C++看作更好的C•第2章类和数据抽象(I)

•第3章类和数据抽象(II)•第4章运算符重载•第5章继承•第6章虚函数和多态性•第7章C++输入/输出流教学要求分为:"识记","理解","熟练应用"2002-2010Lu.Allrightsreserved.No.5教材1.教材《C++程序设计教程》中译本(美)H.M.Deitel,

P.J.Deitel著,机械工业出版社,2000年6月第1版,ISBN7-111-07951-5/TP.14322.上机环境MicrosoftVisualC++(VS2008)MicrosoftCorporatio

n2002-2010Lu.Allrightsreserved.No.6参考资料lC++HowtoProgram(5thEdition)byH.MDeitel,P.JDeitel.PrenticeHall,In

c.2006.ISBN0130384747lTheC++ProgrammingLanguage(SpecialEdition)byBjarneStroustrup.Addison-Wesley,Reading,Mass.2000.ISBN0-201-70073-5

2002-2010Lu.Allrightsreserved.No.7课程重点2002-2010Lu.Allrightsreserved.No.8面向对象的主要特点•抽象性•封装性•继承性•多态性本课程的关键是要掌握这四个特性在C++语言中的具体应用。20

02-2010Lu.Allrightsreserved.No.9抽象性数据类型的使用和数据类型的定义相互独立。即:数据类型的使用不应依赖于数据类型的实现。2002-2010Lu.Allrightsreserved.No.10抽象性•抽象数据类型(ADT)—数据类型的取值范围(域)—数据类型所允许

的操作•类的接口(类的说明)—数据类型的具体数据表示方法的选择—类成员函数和非成员函数的原型设计•类的实现—类成员函数和非成员函数的定义2002-2010Lu.Allrightsreserved.No.

11封装性数据类型的定义是一个相对独立的自包含实体。数据类型的使用者只能通过数据类型的使用界面来使用数据类型。2002-2010Lu.Allrightsreserved.No.12封装性•类的成员保护属性—private内部数据

和内部函数的属性—public接口(类的使用界面)—protected给派生类访问的属性2002-2010Lu.Allrightsreserved.No.13继承性新的数据类型不一定需要每次都从头开始定义,有时可以通过对已有数据类型进行扩充来实现。2002-2010Lu.Allr

ightsreserved.No.14继承性•基类和派生类—从基类定义出派生类—基类指针和派生类指针之间的关系—派生类的构造函数向基类的构造函数提供参数2002-2010Lu.Allrightsreserved.No.

15多态性在同一个操作命令发送给不同数据类型的几个对象时,这些不同类型的对象会进行不同的操作。即:每一种对象根据自己的类型作出不同的响应。2002-2010Lu.Allrightsreserved.No.16多态性•虚函数•动态联编广义的多态性:动态多态性+静态多态性—虚函数动态多态性—

函数名的重载静态多态性—运算符的重载静态多态性2002-2010Lu.Allrightsreserved.No.17另一重要内容—模板模板不属于面向对象思想的范畴。模板是作用于不同数据类型基础上的一类函数或数据类型的统一定义。称为泛型程序设计。2

002-2010Lu.Allrightsreserved.No.18模板•函数模板•类模板模板是软件重用的一种重要形式。2002-2010Lu.Allrightsreserved.No.19课程主线学习本课程应紧紧抓

除面向对象和模板这两大主线。加强上机实践是学好本课程的根本保证。不进行较长时间的上机实践是不可能真正掌握本课程内容的!2002-2010Lu.Allrightsreserved.No.20各章重点200

2-2010Lu.Allrightsreserved.No.21第1章把C++看作更好的C重点•熟悉C++语言相对于C语言的增强功能;认识C语言是学习C++语言的基础。•学习本章内容,应注意与C语言进行比较,理解“C++语言

是更好的C语言”的观点,C++语言是如何加强数据类型安全性检查的,理解新增功能设置的目的。2002-2010Lu.Allrightsreserved.No.22第2章类和数据抽象(一)重点•理解封装和数据隐藏的软件工程概念;理解数据抽象和抽象数据类型(ADT

)的表示方法;学会建立C++的抽象数据类型(类);理解怎样建立、使用和销毁类对象;能够控制对类的数据成员和成员函数的访问;认识面向对象方法的价值。•学习本章内容,应注意认识数据抽象的本质和面向对象方法的优点,熟练掌握类说明和类实现的编程方法,树立采用面向对象的思想

和方法进行程序设计的观点。2002-2010Lu.Allrightsreserved.No.23第3章类和数据抽象(二)重点•能够动态地建立和销毁类对象;能够指定const对象和const成员函数;理解友元函数和友元类的用途;理解怎样

使用静态数据成员和静态成员函数;理解this指针的用法;能够建立和使用模板类及定义模板函数。•学习本章内容,应注意结合上一章所介绍的内容,通过一些示例充分认识数据抽象和抽象数据类型的本质,进一步熟练掌握类说明和类实现的各种编程机制,采用面向对象的思想和方法进行

程序设计。2002-2010Lu.Allrightsreserved.No.24第4章运算符重载重点•理解怎样重定义与新类型一起使用的运算符;理解怎样把一个类的对象转换为另一个类的对象(即:用户定义的类型转换);把握重载运算符的时机;学习利用了重载运

算符的的几个类的例子。•学习本章内容,应注意将类的运算符定义与基本类型的运算符进行比较,选择合适的运算符和合适的定义方式进行编程,理解运算符本质上是一种函数的观念。认识类型转换的必要性,注意正确定义类型转换的语意。2002

-2010Lu.Allrightsreserved.No.25第5章继承重点•能通过继承现有类的方法建立新类;理解继承是如何提高软件可重用性的;理解基类和派生类的概念;能够用继承方法从基类派生出新类。•学习本章内容,应注意以软件的可重用性这一观点来进行思考。注意派生类对象所包含的类成员

及其这些成员的可访问性之间的区别。2002-2010Lu.Allrightsreserved.No.26第6章虚函数和多态性重点•理解多态性的概念;理解怎样声明和使用实现多态性的虚函数;理解抽象类和具体类的区别;学会怎样声明建立抽象类的纯虚函数;认识多态性是如何扩展

和维护应用软件系统的。•本章内容是面向对象程序设计概念的核心内容,注意理解以虚函数为手段实现动态联编的实现原理以及多态性在软件工程中的重要作用。2002-2010Lu.Allrightsreserved.No.27第7章C++输入/输出流重点•理解怎样使用C

++面向对象的输入/输出流;能够以格式化形式输入和输出;理解输入/输出流类的层次结构;理解怎样输入/输出用户自定义类型的对象;能够建立用户自定义的流操纵算子;能够判断输入/输出操作的成功或失败。•本章较详细地介绍C++中输入/输出的有关内

容,要理解大多数编译系统提供的流类库的基本功能,注意输入和输出两种流的区别和联系,标准设备和文件输入/输出的统一处理,基本数据类型和自定义类型的输入/输出的区别和联系等。课间休息2002-2010Lu

.Allrightsreserved.No.29例题讲解2002-2010Lu.Allrightsreserved.No.30例题建立一个表示数组的类。2002-2010Lu.Allrightsreserved.No.31建立数组类型的目的为何要建立“数组”类型?C/C++语言的内部数

组定义和使用方法存在一些较大的缺陷。2002-2010Lu.Allrightsreserved.No.32内部数组的缺陷数组是在实际编程工作中使用十分广泛的一种数据类型。通过C或C++语言,我们可以定义数组这种扩展的数据类型,数组实际上是

一个指针。例如:charv[100];v[0]=‘A’;cout<<v[99];2002-2010Lu.Allrightsreserved.No.33内部数组的缺陷如果程序员小心使用的话,用数组本身所支持的操作能

力来操作数组是可以接受的。但是程序员不注意数组下标范围的话,数组的使用会造成很大的问题,即:下标超出范围,有时会造成程序崩溃。例如:charv[100];v[-1]=‘A’;cout<<v[100];2002-2010Lu.Allrightsreserved.No.3

4内部数组的缺陷另外,数组定义时首先需要确定数组的大小,即:定义数组时的数组大小必须是一个常量,这样做有时会发现后面使用时元素个数不足,有时会发现存贮空间白白浪费掉了。例如:intarrSize;cin>>ar

rSize;charv[arrSize];2002-2010Lu.Allrightsreserved.No.35内部数组的缺陷当把一个数组传递给一个能处理任意大小数组的通用函数时,数组的大小也必须作为一个额外参数传递给函数,这给函数调用

者增加了不该有的负担。例如:voidf(chara[],intarrSize);charv[100];f(v,100);2002-2010Lu.Allrightsreserved.No.36内部数组的缺陷还有,数组内部没有提供一些更

好的操作方法,如:数组赋值、数组比较、数组整体的输入和输出等操作功能。例如:charv1[100],v2[100];v1=v2;if(v1==v2)…...cin>>v1;cout<<v2;2002-2010Lu

.Allrightsreserved.No.37C++的解决方案在C++语言中,语言内部没有提供能克服前述问题的标准数据类型。因此,程序员需要自己定义用来加工数组的数组抽象数据类型(ADT—AbstractDataType)。2002-2010Lu.Allrightsreserved.No.3

8设计方法因为数组是一种定制的、非标准的数据类型,有些C++编译器本身没有这种数据类型,所以需要程序员自己去建立这种数据类型,以扩充和丰富以后可以使用的数据类型。2002-2010Lu.Allrightsreserved.No.39设计方法对于这种

扩充的数据类型,我们在设计时,只需要考虑其对于用户来说应该达到的功能,不需要考虑后面实现的方法。设计的目标是使这种新的数据类型可以像内部标准数据类型一样方便使用,从而使得这种新的数据类型不仅可供程序员自己使用,而且也可以供开发小组和其

他团体使用。2002-2010Lu.Allrightsreserved.No.40设计方法抽象数据类型的设计方法主要是设计两方面的内容:数据类型的取值范围(或称为域Domain)和允许对数据的操作(Operation)。数组的取值范围考虑的因素是

:元素类型、元素个数和元素顺序。2002-2010Lu.Allrightsreserved.No.41设计方法从理论上讲,元素类型可以是任意一种数据类型,但实际上C++语言直接用类实现时必须确定元素类型,如果要能使用任意一种数据类型的话,必须用类模板来实现。这里

,我们限制元素类型为int。即:设计一个“整数数组”类型。2002-2010Lu.Allrightsreserved.No.42设计方法数组的元素个数应该是没有限制的(除非受到系统软硬件资源的制约),通常可以设计为1个以上的元素,具体大小应该允许用户在使用时根据其自身应用的需要动态确定。

很显然,数组元素是具有前后顺序的。2002-2010Lu.Allrightsreserved.No.43设计方法在确定取值范围之后,确定允许的操作。允许的操作应根据使用数组时的实际需要加以确定,包括克服内部数组使用时出现问题的一些功能,如:数组下标检查;增

加使用灵活性的一些功能,如:动态确定数组大小;方便数组使用的一些功能,如:数组整体复制。2002-2010Lu.Allrightsreserved.No.44设计方法根据前述设计原则,可以设计出如下的ADT描述的数据类型:ADT名称:Array

域:不同元素个数的有不同元素值的各种组合。操作:l下标范围检查l任意范围的下标表示l数组复制l数组比较l数组整体输入和输出2002-2010Lu.Allrightsreserved.No.45实现方法在C++语言中,抽象数据类型是用类来实现的。2002-2010Lu.Allri

ghtsreserved.No.46实现方法实现时,首先需要根据抽象数据类型的要求,选择合适的类内部数据表示的方法。内部数据表示方法可以多种多样,一般选择的原则是:尽量简单、直观、利于操作功能的实现、也有利于将来的程序维护。可以先列出几种不同的数据表示方法,后对它们进行分析和比较,选择一种合

适的表示方法。对于数组来说,比较合适的方法就是在动态内存中获取存放数组实际元素的存贮空间,我们在数据表示时,只是记录动态内存的开始地址、数组的当前大小。2002-2010Lu.Allrightsreserved.No.47实现方法在选

择好数据表示之后,需要根据抽象数据类型所允许的各种操作,写出相应的各个函数原型,确定函数名称、函数参数和函数的返回类型。确定函数名称时,如果能用内部运算符比较确切地表示函数功能的话,那么尽可能使用运算符来表示函数名称,这样可以方便用户将来的使用。2002-2010

Lu.Allrightsreserved.No.48实现方法接下来,将数据表示和函数原型组织成类说明的形式,通常写在一个独立的头文件中(如下面的Array.h),供类的实现者和类的使用者使用。这时,需要确

定类中各成员的访问属性。一般原则是:类内部实现部分使用private属性,类接口部分使用public属性。2002-2010Lu.Allrightsreserved.No.49实现方法在定义好类说明文件之后,还

需要做的工作就是使用合适的算法定义类说明文件所说明的每一个函数。通常将这些函数集中放在一个源程序文件中(如下面的Array.cpp)。注意:类的成员函数使用类名作用域限定符,而类的友元函数则不使用类名作用域限定符。2002-2010Lu.Al

lrightsreserved.No.50数组类Array•array.h是类说明的头文件;•array.cpp是类实现的源程序文件。2002-2010Lu.Allrightsreserved.No.51//*******************************************

********//array.h简单的类Array(用于整数)//成员函数在文件array.cpp中定义//***************************************************#ifndefARRAY_H#de

fineARRAY_H#include<iostream.h>classArray{friendostream&operator<<(ostream&,constArray&);friendistream&operator>>(istream&,Arr

ay&);public:Array(intarraySize=10);//缺省构造函数Array(constArray&);//拷贝构造函数~Array();//析构函数array.h2002-2010Lu.Allrightsreserved

.No.52Array&operator=(constArray&);//给数组赋值intoperator==(constArray&)const;//比较数组的相等性intoperator!=(constArray&)cons

t;//比较数组的不相等性int&operator[](int);//下标运算符private:int*ptr;//指向数组第一个元素的指针intsize;//数组的大小};#endifarray.h2002-2010Lu.All

rightsreserved.No.53//***************************************************//array.cpp定义类Array的成员函数//******************

*********************************#include<iostream.h>#include<stdlib.h>#include<assert.h>#include"array.h"array.cpp2

002-2010Lu.Allrightsreserved.No.54//类Array的缺省构造函数Array::Array(intarraySize){size=arraySize;//数组缺省大小为10ptr=n

ewint[size];//为数组分配内存空间assert(ptr!=0);//内存分配不成功时中止for(inti=0;i<size;i++)ptr[i]=0;//对数组初始化}array.cpp2002-2010Lu.Allrightsrese

rved.No.55//类Array的拷贝构造函数Array::Array(constArray&init){size=init.size;//指定数组的大小ptr=newint[size];//为数组分配内

存空间assert(ptr!=0);//内存分配不成功时中止for(inti=0;i<size;i++)ptr[i]=init.ptr[i];//把初始化值拷贝到对象中}array.cpp2002-2010Lu.Allrightsreserved.No.56//析构函数Array::~

Array(){delete[]ptr;//回收分配给数组的内存空间}array.cpp2002-2010Lu.Allrightsreserved.No.57//重载下标运算符int&Array::operator[](intsubscript){//检测下标越界错误assert

(0<=subscript&&subscript<size);returnptr[subscript];//返回的引用可用作左值}array.cpp2002-2010Lu.Allrightsreserved.No.58//

/判断两个数组是否相等。若相等,返回1,否则返回0intArray::operator==(constArray&right)const{if(size!=right.size)return0;//数组

的大小不相等for(inti=0;i<size;i++)if(ptr[i]!=right.ptr[i])return0;//数组不相等return1;//数组相等}array.cpp2002-2010Lu.Allrightsreserved.No.59//判

断两个数组是否不相等。若不相等,返回1,否则返回0intArray::operator!=(constArray&right)const{return!operator==(right);}array.cpp2002-2010Lu.Allrigh

tsreserved.No.60//重载赋值运算符Array&Array::operator=(constArray&right){if(this!=&right)//检查是否是自我赋值{delete[]ptr;//回收内存空间size=ri

ght.size;//指定对象的大小ptr=newint[size];//为数组拷贝分配内存空间assert(ptr!=0);//内存分配不成功时中止for(inti=0;i<size;i++)ptr[i]=right.ptr[i];}return*this;//使得能连续执行x=y=

z;}array.cpp2002-2010Lu.Allrightsreserved.No.61//重载用于类Array的输入运算符,为整个数组赋值istream&operator>>(istream&input,Array&a){

for(inti=0;i<a.size;i++)input>>a.ptr[i];returninput;//使得能连续执行cin>>x>>y;}array.cpp2002-2010Lu.Allrightsreserved.No

.62//重载用于类Array的输出运算符ostream&operator<<(ostream&output,constArray&a){for(inti=0;i<a.size;i++){output<<a.ptr[i]<

<'';if((i+1)%10==0)output<<endl;}if(i%10!=0)output<<endl;returnoutput;//使得能连续执行cout<<x<<y;}array.cpp2002-2010Lu.Allrightsreserved.No.63测试方法在实现一个新

的数据类型之后,我们需要确定实现是正确的,符合ADT设计的描述。有时,还需要确定数据类型实现的执行效率是符合要求的。确定方法就是对新建数据类型进行测试,进行试用。一般需要对应ADT描述,确定各种取值范围内的值是可以表示出来的,各种功能是可以正确使用的。例如:对象初始化、对象赋值、对象销

毁、以及其他各种ADT规定的功能。2002-2010Lu.Allrightsreserved.No.64测试方法以下是一个测试程序的例子:2002-2010Lu.Allrightsreserved.

No.65//***************************************************************//TestArray.cpp//测试类Array的程序//*

**************************************************************#include<iostream.h>#include"array.h"i

ntmain(){//建立两个数组Arrayintegers1(7),integers2;testArray.cpp2002-2010Lu.Allrightsreserved.No.66//打印integer

s1的大小和内容cout<<"\n\nSizeofarrayintegers1is"<<"\nArrayafterinitialization:\n"<<integers1;//打印integers2的大小和内容cout<

<"\n\nSizeofarrayintegers2is"<<"\nArrayafterinitialization:\n"<<integers2;testArray.cpp2002-2010Lu.Allright

sreserved.No.67//输入并打印出integers1和integers2的值cout<<"\nInput17integers:\n";cin>>integers1>>integers2;cout<<"Afterinput,thearra

yscontain:\n"<<"integers1:"<<integers1<<"integers2:"<<integers2;//用integers1作为初始化值建立数组integers3,//打印

出integers3的大小和内容Arrayintegers3(integers1);cout<<"\nSizeofarrayintegers3is"<<"\nArrayafterinitialization:\n"<<integers3;testArray.cpp2002-2010

Lu.Allrightsreserved.No.68//使用重载的不相等运算符!=cout<<"\nEvaluating:integers1!=integers2\n";if(integers1!=int

egers2)cout<<"Theyarenotequal\n\n";//使用重载的赋值运算符=cout<<"Assigningintegers2tointegers1;\n";integers1=integers2;

cout<<"integers1:"<<integers1<<"integers2:"<<integers2;//使用重载的相等运算符==cout<<"\nEvaluating:integers1==intege

rs2\n";if(integers1==integers2)cout<<"Theyareequal\n\n";testArray.cpp2002-2010Lu.Allrightsreserved.No.69//用重载的下标运算符建

立右值cout<<"integers1[5]is"<<integers1[5]<<endl;//用重载的下标运算符建立左值cout<<"Assigning1000tointegers1[5]\n";integers1[5]=1000;cout<<"inte

gers1:"<<integers1;//试图使用下标越界的元素cout<<"\nAttemptingtoassign1000tointegers1[15]"<<endl;integers1[15]=1000;//错误:下标越界return0;}testArray.cpp2002-2010L

u.Allrightsreserved.No.70小结至此,我们完成了数组抽象数据类型的设计、实现和测试工作。学习C++,就是要学会根据应用需要设计和实现各种各样的数据类型。答疑时间第1次网上直播讲课结束

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?