C程序设计(自考4737)第2章.ppt_第1页
C程序设计(自考4737)第2章.ppt_第2页
C程序设计(自考4737)第2章.ppt_第3页
C程序设计(自考4737)第2章.ppt_第4页
C程序设计(自考4737)第2章.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

第二章从结构到类的演变,2.1结构的演化.结构发生质的演变1.函数与数据共存,C+允许结构中定义函数,成为成员函数在结构中同时定义成员变量与成员函数使用格式:结构对象.成员变量结构对象.成员函数,第二章从结构到类的演变,1.函数与数据共存结构的定义,structpointdoublex,y;voidSetxy(doublea,doubleb)x=a;y=b;voidDisplay()coutxtyendl;,第二章从结构到类的演变,1.函数与数据共存结构的定义,structpointdoublex,y;voidSetxy(doublea,doubleb)x=a;y=b;voidDisplay()coutxtyendl;,数据成员,成员函数,第二章从结构到类的演变,1.函数与数据共存结构的定义,第二章从结构到类的演变,运行结果,第二章从结构到类的演变,主函数,完整程序,修改后的程序,第二章从结构到类的演变,2封装若定义结构体时,使用了private关键字,则产生封装性,使用了private关键字,则产生封装性,第二章从结构到类的演变,2封装在定义结构时,若使用了private则产生封装性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。若未添加private则表示默认为public。类定义时默认为private。,第二章从结构到类的演变,2.1.2使用构造函数初始化结构的对象在定义结构时,与结构同名的函数称为构造函数。若定义的函数与某个已定义函数重名而参数类型或个数不同,则称为函数重载。,2.1.2使用构造函数初始化结构的对象,问题:那个函数是构造函数?那个函数被重载了?,结构体的定义,2.1.2使用构造函数初始化结构的对象,注:构造函数在定义结构体对象时自动执行,并根据是否初始化来自动选择所调用的构造函数,2.1.2使用构造函数初始化结构的对象,2.1.2使用构造函数初始化结构的对象,第二章从结构到类的演变,2.2从结构演化成一个简单的类,将程序中struct替换为class即变为类的标准定义形式,第二章从结构到类的演变,2.2从结构演化成一个简单的类,产生类对象p1,p2,为对象的属性赋值,显示对象属性值,第二章从结构到类的演变,2.2从结构演化成一个简单的类,类图的表示,类名,类属性/成员变量,类操作/成员函数,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,第二章从结构到类的演变,2.3面向过程和面向对象,简单了解对象的含义,第二章从结构到类的演变,面向过程的求解步骤给出三角形三个顶点坐标,计算三边长,并输出步骤:输入x1,y1,x2,y2,x3,y3六个数据计算(x1,y1)和(x2,y2)距离计算(x1,y1)和(x2,y2)距离计算(x1,y1)和(x2,y2)距离输出三个距离,第二章从结构到类的演变,面向对象的求解步骤给出三角形三个顶点坐标,计算三边长,并输出,设计类将点设计为一个类,并提供相关的属性和操作,第二章从结构到类的演变,面向对象的求解步骤给出三角形三个顶点坐标,计算三边长,并输出,定义对象同时给出坐标pointA(x1,y1)pointB(x2,y2)pointC(x3,y3),第二章从结构到类的演变,面向对象的求解步骤给出三角形三个顶点坐标,计算三边长,并输出,定义对象,然后获取坐标pointA;pointB;pointC;A.Getx();A.Gety();B.Getx();B.Gety();C.Getx();C.Gety();,第二章从结构到类的演变,面向对象的求解步骤给出三角形三个顶点坐标,计算三边长,并输出,计算距离并输出AB=A.GetLength(B);AC=A.GetLength(C);BC=B.GetLength(C);,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.1对象三要素:对象名,属性,操作,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.1对象三要素:对象名,属性,操作,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.2抽象和类,面向对象鼓励程序员以抽象的观点看待程序,即程序是由一组抽象组成的。另一方面,我们又可以将一组对象的共同特征时一步抽象出来,从而形成类概念。抽象是一种从一般的观点看待事物的方法,它要求程序员集中于事物的本质特征,而是具体细节或具体实现。面向对象鼓励程序员以抽象的观点看待程序,也就是说,程序是一组抽象的对象-类组成的(严格讲,C+程序不是这样,在程序中还有像mail这样的全局函数)。程序员从一组对象为起点,抽取公共的行为将其放入到一个类中,这基本上是抽象分类的观点,不同类的对象具有不同的行为。类的概念来自于人们认识自然、认识社会的过程。在这一程中,人们主要使用两种方法:由特殊到一般的归纳法和由一般到特殊的演绎法。在归纳的过程中,我们从,一个个具体的事物中把共同的特征抽取出来,形成一个一般的概念,这就是归类;在演绎的过程中我们又把同类的事物,根据不同的特征分成不同的小类,这又是分类。对于一个具体的类,它有许多具体的个体,我们就管这些个体叫做对象。举个例子,人是一个类,具有直立行走、会使用工具等一些区别于其它事物的共同特征;而张三、李四、王五等一个个具体的人,就人这个类的一个个对象,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.3封装,在C+语言中,类是支持数据封装的工具,对象是数据封装的实现。按照面向对象的封装原则,一个对象的属性和操作是紧密结合的,对象的属性只能由这个对象的操作来存取。对象的操作分为内部操作和外部操作。内部操作只供对象内部的其他操作使用,不对外提供。外部操作对外提供一个消息接口,通过这个接口接收对象外部的消息并为之提供操作(服务)。对象内部数据结构的这种不可访问性称为信息(数据)隐藏。数据封装给数据提供了与外界联系的标准接口。无论是谁,只有通过这些接口,使用规范的方式,才能访问这些数据。同时,由于程序员总是和接口打交道,他也就不必要了解数据的具体细节。简言之,封装就是把对象的属性和操作结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。由此可见,封装要求一个对象应具备明确的功能,并具有接口以便和其他对象相互作用。同时,对象的内部实现(代码和数据)是受保护的,外界不能访问它们。封装使得一个对象可以像一个部件一样应用在各种程序中,而不用担心对象的功能受到影响。,数据封装一方面使得程序员在设计程序时可以专注于自己的对象,同时也切断了不同模块之间数据的非法使用,减少了出错的可能性。在类中,封装是通过存取权限实现的。例如将每个类的属性和操作分为私有的和公有的两种类型。对象的外部只能访问对象的公有部分,不能直接访问对象的私有部分。,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.4继承,对象的另一个特点是继承。继承是一个对象可以获得另一个对象的特性的机制,它支持层次类这一概念。例如水果类包括香蕉、苹果、橘子和菠萝,而苹果类又有香蕉苹果、富士苹果、国光苹果、京帅苹果等。通过继承,低层的类只须定义特定于它的特征,而共享高层类中的特征。继承具有重要的实际意义,它简化了人们对事物的认识和描述。例如我们知道苹果是可以吃的,富士苹果继承了苹果的特征,当然也可以吃。再如我们认识了轮船的特征之后,就知道客轮是轮船的特殊种类,它具有轮船的特征。当研究客轮时,只要把精力用于发现和描述客轮独有的那些特征即可。C+语言允许单继承和多继承。,继承是面向对象语言的重要特性。一个类可以生成它的派生类,派生类还可以再生成它的派生类。派生类继承了基类成员,另外它还可以定义自己的成员。继承是实现抽象和共享的一种机制。,第二章从结构到类的演变,2.4C+面向对象程序设计特点,2.4.5多态性,C+语言支持多态性。例如允许函数重载和运算符重载;定义虚函数,通过它来支持动态联编等。函数的重载就是可以定义相同名字的函数,实现不同的功能。这种不同的对象可以调用相同名称的函数,并导致完全不同的行为的现象称为多态性。利用多态性,程序中只需进行一般形式的函数调用,函数的实现细节留给接受函数调用的对象。这大大提高了我们解决复杂问题的能力。举个最简单的例子,将两个数“相加”,这两个数可以是整数或实数,将“+”看作一个特殊函数,则5+9和3.6+6.8都是使用“+”来完成两个数相加的功能,这就是“+”体现的多态性。类的多态性更多的内容,将留在后面章节讨论,这里不再赘述。动态联编也是多态性的一个重要特征。,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,类名,类的属性用于存放字符串,类的操作/方法/成员函数,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,该类是C+语言中的内部预定义类,要在程序中使用该类时必须添加头文件#inculude,第二章从结构到类的演变,2.5使用类和对象,2.5.1使用string对象,类的初始化:stringstr1=“A”;stringstr1=A;stringstr1=AB;stringstr1=“AB”;可以以数组的形式使用str1对象中的字符串str10的值是?str11的值是?,2.5.1使用string对象,类的初始化:stringstr1(“hello,”);stringstr2=“world”;可以以数组的形式使用str1对象中的字符串str10的值是?str20的值是?,2.5.1使用string对象,2.5.1使用string对象,运行结果,2.5.1使用string对象,string对象允许使用+运算,2.5.1使用string对象对象的方法(操作/成员函数):对象名.成员函数str1.size()String对象可使用+运算Str1=str2+str3若str2=“hello,”str3=“everyone”则str1的结果是?,2.5.2使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.size()若Str1=“everyone”Str1.size()值为:9,2.5.2使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.substr()若Str1=“everyone”Str1.substr(3,3)值为:“one”,C+中字符串中字符位置计数从0开始,2.5.2使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.substr(),C+中字符串中字符位置计数从0开始,2.5.2使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.find(要查找的字符串,开始位置)结果为子串的位置,C+中字符串中字符位置计数从0开始,2.5.2使用string对象的成员函数getline函数的使用功能:利用cin函数输入一行字符串存入对象例如:getline(cin,str1,“n”),2.5.2使用string对象的成员函数getline函数的使用功能:利用cin函数输入一行字符串存入对象例如:getline(cin,str1,“n”),简单应用:日期格式转换,2.5.3使用complex对象complex类用于定义一个复数对象使用时添加头文件#include定义格式:complexnum1(1,2);,2.5.4使用对象小结使用标准类库中的类时,须添加头文件。使用string对象添加?头文件?,添加头文件#include并使用标准命名空间usingnamespacestd;,2.5.4使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。inti;stringstr1;定义时初始化:inti=1;或inti(1);stringstr1=“hello”;或stringstr1(“hello”);,2.5.4使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。同类的不同对象由对象名和属性来区分。具有相同的成员函数。stringstr1=“hello”;stringstr2(“everyone”);Coutstr1.size()endl;Coutstr2.size()endl;,2.5.4使用对象小结不同类对象具有不同的成员函数可实现不同操作。Complexnum1(1,2);Stringstr1(“hello”);Coutnum1.real()endl;Coutstr1.sizeendl;Coutstr1endl;coutnum1endl;,2.5.4使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。同类的不同对象由对象属性来区分。不同类对象具有不同的成员函数可实现不同操作。类是具有相同特征和操作的对象的抽象。,2.6string对象数组与泛型算法第1.2.6节介绍的范型算法同样适合string类,但string对象之间可以直接赋值,所以更为简单。需要注意的是,不要将1.2.6节介绍的find函数与string本身的成员函数混淆。另外,string类还有一个swap成员函数,用来交换两个对象的属性。假设有两个string类的对象str1和str2,下面两种调用方式是等效的:str1.swap(str2);str2.swap(str1);,2.6string对象数组与泛型算法,演示string对象的例子。#include#include#includeusingnamespacestd;voidmain()stringstr1=wearehere!,str2=str1;reverse(/逆向输出这里使用str1初始化str2(与str2=str1等效),是为了在保证复制时,str2能有足够的空间存储str1。另外要注意ostream_iterator的数据类型是char,不是string。输出结果如下:,2.6string对象数组与泛型算法,!ereheraew!ereheraewwearehere!string是系统提供的类,当然就有其特殊性质。其实,string类提供了一对用来指示其元素位置的基本成员函数:指示第一元素的begin()和指示结束的标记end()。它们标示要进行迭代的元素空间。如果begin不等于end,算法便会首先作用于begin所指元素,并将begin前进一个位置,然后作用于当前的begin所指元素身上,如此继续进行,直到begin等于end为止,所以它们是元素存在的半开区间begin,end)。,2.6string对象数组与泛型算法,图2.8是str1和迭代区间示意图。str1.begin()指示第1个元素str.end()指示最后一个元素之后的结束位置有了这两个成员函数,就可以用它们表示迭代区间。,第

温馨提示

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

评论

0/150

提交评论