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

下载本文档

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

文档简介

第二章从结构到类的演变2.1结构的演化2.1.1结构发生质的演变1.函数与数据共存C++允许结构中定义函数,成为成员函数在结构中同时定义成员变量与成员函数使用格式:结构对象.成员变量结构对象.成员函数第二章从结构到类的演变1.函数与数据共存—结构的定义structpoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){cout<<x<<"\t"<<y<<endl;}};第二章从结构到类的演变1.函数与数据共存—结构的定义structpoint{doublex,y;voidSetxy(doublea,doubleb){x=a;y=b;}voidDisplay(){cout<<x<<"\t"<<y<<endl;}};数据成员成员函数第二章从结构到类的演变1.函数与数据共存—结构的定义第二章从结构到类的演变运行结果第二章从结构到类的演变主函数完整程序修改后的程序第二章从结构到类的演变2封装假设定义结构体时,使用了private关键字,那么产生封装性使用了private关键字,那么产生封装性第二章从结构到类的演变2封装在定义结构时,假设使用了private那么产生封装性,表示成员为私有的,只能在结构体内部通过公有成员函数使用。假设未添加private那么表示默认为public。类定义时默认为private。第二章从结构到类的演变2.1.2使用构造函数初始化结构的对象在定义结构时,与结构同名的函数称为构造函数。假设定义的函数与某个已定义函数重名而参数类型或个数不同,那么称为函数重载。2.1.2使用构造函数初始化结构的对象问题:那个函数是构造函数?那个函数被重载了?结构体的定义2.1.2使用构造函数初始化结构的对象注:构造函数在定义结构体对象时自动执行,并根据是否初始化来自动选择所调用的构造函数2.1.2使用构造函数初始化结构的对象调用无参构造函数调用有参构造函数为xy设置值显示p1,p2的xy值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++面向对象程序设计特点封装在C++语言中,类是支持数据封装的工具,对象是数据封装的实现。按照面向对象的封装原那么,一个对象的属性和操作是紧密结合的,对象的属性只能由这个对象的操作来存取。对象的操作分为内部操作和外部操作。内部操作只供对象内部的其他操作使用,不对外提供。外部操作对外提供一个消息接口,通过这个接口接收对象外部的消息并为之提供操作〔效劳〕。对象内部数据结构的这种不可访问性称为信息〔数据〕隐藏。数据封装给数据提供了与外界联系的标准接口。无论是谁,只有通过这些接口,使用标准的方式,才能访问这些数据。同时,由于程序员总是和接口打交道,他也就不必要了解数据的具体细节。简言之,封装就是把对象的属性和操作结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。由此可见,封装要求一个对象应具备明确的功能,并具有接口以便和其他对象相互作用。同时,对象的内部实现〔代码和数据〕是受保护的,外界不能访问它们。封装使得一个对象可以像一个部件一样应用在各种程序中,而不用担忧对象的功能受到影响。数据封装一方面使得程序员在设计程序时可以专注于自己的对象,同时也切断了不同模块之间数据的非法使用,减少了出错的可能性。在类中,封装是通过存取权限实现的。例如将每个类的属性和操作分为私有的和公有的两种类型。对象的外部只能访问对象的公有局部,不能直接访问对象的私有局部。第二章从结构到类的演变2.4C++面向对象程序设计特点2.4.4继承对象的另一个特点是继承。继承是一个对象可以获得另一个对象的特性的机制,它支持层次类这一概念。例如水果类包括香蕉、苹果、橘子和菠萝,而苹果类又有香蕉苹果、富士苹果、国光苹果、京帅苹果等。通过继承,低层的类只须定义特定于它的特征,而共享高层类中的特征。继承具有重要的实际意义,它简化了人们对事物的认识和描述。例如我们知道苹果是可以吃的,富士苹果继承了苹果的特征,当然也可以吃。再如我们认识了轮船的特征之后,就知道客轮是轮船的特殊种类,它具有轮船的特征。当研究客轮时,只要把精力用于发现和描述客轮独有的那些特征即可。C++语言允许单继承和多继承。继承是面向对象语言的重要特性。一个类可以生成它的派生类,派生类还可以再生成它的派生类。派生类继承了基类成员,另外它还可以定义自己的成员。继承是实现抽象和共享的一种机制。第二章从结构到类的演变2.4C++面向对象程序设计特点2.4.5多态性C++语言支持多态性。例如允许函数重载和运算符重载;定义虚函数,通过它来支持动态联编等。函数的重载就是可以定义相同名字的函数,实现不同的功能。这种不同的对象可以调用相同名称的函数,并导致完全不同的行为的现象称为多态性。利用多态性,程序中只需进行一般形式的函数调用,函数的实现细节留给接受函数调用的对象。这大大提高了我们解决复杂问题的能力。举个最简单的例子,将两个数“相加”,这两个数可以是整数或实数,将“+”看作一个特殊函数,那么5+9和3.6+6.8都是使用“+”来完成两个数相加的功能,这就是“+”表达的多态性。类的多态性更多的内容,将留在后面章节讨论,这里不再赘述。动态联编也是多态性的一个重要特征。第二章从结构到类的演变2.5使用类和对象使用string对象类名类的属性用于存放字符串类的操作/方法/成员函数第二章从结构到类的演变2.5使用类和对象使用string对象该类是C++语言中的内部预定义类,要在程序中使用该类时必须添加头文件#inculude<string>第二章从结构到类的演变2.5使用类和对象使用string对象类的初始化:stringstr1=“A”;stringstr1=‘A’;stringstr1=‘AB’;stringstr1=“AB”;可以以数组的形式使用str1对象中的字符串str1[0]的值是???str1[1]的值是???使用string对象类的初始化:stringstr1(“hello,”);stringstr2=“world”;可以以数组的形式使用str1对象中的字符串str1[0]的值是???str2[0]的值是???使用string对象使用string对象运行结果使用string对象string对象允许使用+运算使用string对象对象的方法(操作/成员函数):对象名.成员函数str1.size()String对象可使用+运算Str1=str2+str3假设str2=“hello,”str3=“everyone”那么str1的结果是???使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.size()假设Str1=“everyone”Str1.size()值为:9使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.substr()假设Str1=“everyone”Str1.substr(3,3)值为:“one”C++中字符串中字符位置计数从0开始使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.substr()C++中字符串中字符位置计数从0开始使用string对象的成员函数成员函数使用格式:对象名.成员函数例如:str1.find(要查找的字符串,开始位置)结果为子串的位置C++中字符串中字符位置计数从0开始使用string对象的成员函数getline函数的使用功能:利用cin函数输入一行字符串存入对象例如:getline〔cin,str1,“\n”〕使用string对象的成员函数getline函数的使用功能:利用cin函数输入一行字符串存入对象例如:getline〔cin,str1,“\n”〕简单应用:日期格式转换使用complex对象complex类用于定义一个复数对象使用时添加头文件#include<complex>定义格式:complex<int>num1(1,2);使用对象小结使用标准类库中的类时,须添加头文件。使用string对象添加???头文件?添加头文件#include<string>并使用标准命名空间usingnamespacestd;使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。inti;stringstr1;定义时初始化:inti=1;或inti〔1〕;stringstr1=“hello”;或stringstr1(“hello”);使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。同类的不同对象由对象名和属性来区分。具有相同的成员函数。stringstr1=“hello”;stringstr2(“everyone”);Cout<<str1.size()<<endl;Cout<<str2.size()<<endl;使用对象小结不同类对象具有不同的成员函数可实现不同操作。Complexnum1(1,2);Stringstr1(“hello”);Cout<<num1.real()<<endl;Cout<<str1.size<<endl;Cout<<str1<<endl;cout<<num1<<endl;使用对象小结使用标准类库中的类时,须添加头文件。定义对象方式同变量定义方式。定义对象时可对对象进行初始化。同类的不同对象由对象属性来区分。不同类对象具有不同的成员函数可实现不同操作。类是具有相同特征和操作的对象的抽象。2.6string对象数组与泛型算法第节介绍的范型算法同样适合string类,但string对象之间可以直接赋值,所以更为简单。需要注意的是,不要将节介绍的find函数与string本身的成员函数混淆。另外,string类还有一个swap成员函数,用来交换两个对象的属性。假设有两个string类的对象str1和str2,下面两种调用方式是等效的:

str1.swap(str2);str2.swap(str1);2.6string对象数组与泛型算法演示string对象的例子。#include<iostream>#include<string>#include<algorithm>usingnamespacestd;voidmain(){ stringstr1="wearehere!",str2=str1; reverse(&str1[0],&str1[0]+12);//字符串元素逆向 cout<<str1<<endl;//正向输出逆向后的内容 copy(&str1[0],&str1[0]+12,&str2[0]);//原样拷贝到str2 cout<<str2<<endl;//正向输出 reverse_copy(&str2[0],&str2[0]+12,ostream_iterator<char>(cout));//逆向输出}这里使用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、考试所占分值4%。2、重点内容:〔1〕面向对象程序设计的根本概念。〔2〕string类的用法。3、如没有使用private关键字定义类的数据成员,那么默认为〔A〕A.private B.publicC.protec

温馨提示

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

评论

0/150

提交评论