版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第13秦C列C+第13章C到C+131面向对象技术13.2改进的C语言13.3 C+的输入与输出134类与对象13.5程序设计举例第13伞5 C+13.1面向对象技术13.1.1面向对象技术的由来和发展面向对線技术产住的IY景与结构化程序设计方法 产生的背景类似,而向对彖程序设计方法(OOP)是 在结构化程序设讣方法的肚础上发展而來的。131 5 C+13.1.2面向对象技术的两大要素1 对象从概念上讲.对彖代表着正在创建系统小的个实体。从形式上讲,对彖是待处理的程序单元,是数据和方 法的封装体。在C+中是数据成员和成员函数的封装体。方法曲若I操作构成。对象实现了信息隐藏,方法的 具体实现外部
2、是不可见的,封装的11的足阻止卜法访问。 对象通过消息与另一个对象传递信息。消息与方法-对 应,在C+中,消息就是成员函数的调丿lh13 5 C+2类类是对象的抽象及描述,是创建对象的样板,它 包含着一类对象的数据描述和方法定义。一个类的所有对象部令相同的数据结构,共享相 同的方法,而各个对彖仃各口不同的状态,类是所仃 对彖的共同行为和不同状态的集合。由个特定的类所创建的对彖称为这个类的实例。第13伞5C+13.1.3面向对象技术的三大机制1 封装封装的对象是数据和方法,支持数据封装就是支持 数据抽象。在C+中,类是支持数据封装的匚具,对象则 是数据封装的实现。没冇封装,就没冇面向对象技术。另
3、外,封装还提供种对数据访问严格控制的机制。 因此,数据将被隐藏在封装体中,该封装体通过操作接 口与外界交换信息。第13伞C钊C+2.继承类提供r说明一组对彖结构的机制。借助继承这一重 要机制,已存在的类八有建立了类的能力,进而建立类的层 次,扩充类的定义。继承提供了创建新类的种方法,个新类可以通过对 己冇类进行修改和扩充來定义。从-个类继承定义的新类, 将继承已有类的方法和属件,并【.可添加不包含在父类中的 新方法和屈性。繭类被称为(2有类的(类,乂称为派生类, 已有类称为新类的父类,又称为基类。C卄屮允许单继承和多继承,一个类可以根据盂要生成 派生类。_3.多态多态是指相同的语法结构可以代表
4、不同类型的实体或 苦对不同类型的实体进行操作,即发出同样的消息被不同 对彖接收时导致完全不同的行为。C+允许函数名和运算符鱼载,允许一个相同的标识符 或运算符代表参个不同实现的函数,这是编译时的多态性。C+屮可以定义熄两数,通过定义虚曲数來支持动态联 编。动态联编是另一类重要的多态性,箔态性形成由父类 和它们的了类组成的个树型结构。在这个树中的每个 子类可接收一个或多个具有相同名字的消息。当一个消息 被这个树中一个类的一个对象接收时,这个对象动态地决 定岂多态性。第13拿5 C+13.1.4面向对象程序设计面向对象的程序设计方法是口前最先进的程用设计方 法。面向对象程序设计模拟人类认识问题较高
5、.较广层次 的过程。结构化程序设计强调功能抽象,程序的模块化, 基功能进行模块分解;而向对象程序设计以数据抽象为 基础,综合了功能抽象和数据抽象,基于数据抽象进行模 块分解。第13章5 C+13.2改进的C语言13.2.1 C+程序1.C+程序一般结构/c-M-ftir的简单实例# include *riostream.irmain ()(doublex y:COUIVV请输入两个数:cinxy:double z:z=x+y:coin vC+y=v Window及Help 9 个菜 单项。13f 5 C+图 13- I第13勒5 C+2)编译连接和运行源程序选择菜单项Build,出现Build
6、的下拉式菜单,在该下拉 式菜屮选择Compile 菜单项,这时系统开始对当 询的源程序进行编译。在编译的过程中,将所发现的错误 显示在屏幕下方的“Build窗口中。所显示的出错信息指 出该错误所在的行号和该错浜的性质,程序员可根据这吃 信息采用全屏幕编辑方式修改程序。当用鼠标双击出错信 息提示行时,该错误信息对应的行将加亮显示,或在该行 前而用一个箭头加以指示。往往因为一个错谋而出现多行 出错信息,因此,常常在修改一条错谋后,再迪新编译, 如果有错误,再继续修改,宜到没有错误为止。第13勒5 C+在没有错误时,显示错谋信息的窗I丨内将显示如 下信息:*.obj-0 error (s) , 0
7、warning (s)编译无错误后,再进行连接。这时选择“Build菜 单中的“Build *exe/z选项。同样,对出现的错误 要根据出错信息行屮显示内容进彳亍修改,直到编译连 接无错误为止。这时,在“Build窗口会显示如下信息:*.exe-0error (s) 0 warning (s)1322常规改进1新增的关键字asmcatchclassdelete friendinlinenewoperatorprivateprotectedpublic templatethisvirtual第13章C列C+2 注释即用“/导引出单行注释当然,C中原有的 /*和*/注释方法,仍可使用,并且常用于多
8、行注释 情况。3 类型转换O+支持两种不同的类型转换形式:ini i=0;long 1= (long) i: C的类型转换long m=long (i) : C+的新风格C+新风格的类型转换形式看上去像是一个函数调用, 所以可读性较好。而且,这种形式也适合于用八定义类型 的转换(用定义函数來实现)。第13勒5 C+4 灵活的声明5 constC+中,类型限定符constJIJ来表示常量,所以, C+中的常就可以是有类型的,程序员不必再用# define创建无类型常量。例如:const int size=IOO;声明成const的变量,实际是常量,在程序中是用 任何方法不可修改的。ANSI C从
9、C卄中借用rconst的概念,但实现方法 有所不同。第13伞5 C+6、structC+的struct的标识符4看作是类型名,所以定义某 个struct变量比C中更加直观。例如,在C中:struct point int x; int y):struct point p:而在C卄中:struct point int x: int y|:point p;union的情况也是如此。为了保持兼容性,C+仍然接受老用法。在后面会看到, C+的类就是对C中strucl的扩充。7.作用域分辨运算符“:”“:”是作用域分辨运算符,它用于访问在为前作 用域中被隐藏的数据项。例如:int a:int main (
10、)(float a:a=l.5; 访问十询作用域的a:a=2: /访问全局域的a13.23 C+的动态内存分配C程用中,动态内心分配是通过调用诸如malloc()和free ()等库函数来实现,而C+给出了川new和delete运舁符进行动态内存分呢的新方法。第13伞5 C+第 13* 5 C+13.2.4引用引入引用机制后,可有如卜C+程序:void swapinl (int &a* ini &b) 农示引用,类似 f pascal 中变参(int (cinp=a:a=b; b=tcmp:第13章C列C+调用该函数的C+方法为:swapint (x y):运算符“&表示引用,可以把参数乐b看
11、作是调用实 参的别名,C+自动把x、 y的地址作为参数传递给 swapint ()函数,形参与实参共享存储单元。当人的结构(如用户定义类的对象)被传递给函数时, 使川引川参数可使得参数传递效率得到提烏。若不需改变 参数的值,可Jllconst对参数说明加以限定,从而保护数据 的安全性。例如:void geldata (const int & data)13.2.5 C+中的函数1. main ()C并无特别规定main ()函数的格式,因为通 常并不关心返回何种状态给操作系统。然而,C+却 要求main ()函数匹配下面两种原型之_:Void main ()int main (int argc
12、. char*argv )第 13* 5 C+2.函数原型函数原型(prototyping)的概念在前血章节C提及, 其实ANSI C正是从C卄中借用了这做法。函数原型实 际上就是対函数的头格式进彳J:说明,包含函数名、参数 及返回值类型。传统C中的函数说明只是定义函数的返回值的类型, 并不涉及参数,如:int something ():而在C+屮的函数说明应是详细的头格式:int something (char*str, unsigned int len):第13車5C+3 内联函数当函数定义是lhinline开头时,表明此函数为内联 函数。编译后,它不是单独段可调用的代码,而是 被插入在对
13、该函数的毎次调川处,从而完成与函数 调用柑同的功能。例如:inline int sum (int a, int b)return a+b: 这样函数调用无需栈,代码重用。第13伞5 C+4缺省参数值void delay (int Ioops= 1(X)0): 网数原型,给出缺省的参数值void delay (ini loops) 函数运义(for (int i=0: i complex c2)complex t;t.r=c I.r+c2.r:t.i=c I.i+c2.i:return (t);第13伞5 C+JIJoperatorJT;跟运算符号來定义帀载运算符函数。 重载运算符的使用,如同运
14、算符原来的使用规则。 例如:complex x, y. sum:sum=x+y :显然,通过重载,C+的语旬史易丁理解。第13秦5 C+13.3 C+的输入与输出133.1 C+流类结构1. iostream库iostrca m库中具有streambuf和ios两个平彳f的类,这 都是基木的类,分别完成不同的匸作。streambuf类提供 基本流操作,但不提供格式支持。类ios为格式化I/O提 供基本操作。2 标准流iostrcam.h说明 了 标准流对象cin、cout ccrr 与clog。在包含iostrcam.h以看,这些流对象就C经自动建立并打 开f o cin是标准输入流,对应于C
15、的stdin; coul是标准 输出流,对应的stdout; ccn和clog流被连到标准输出 h对应J C的stderr。cerr和clog之间的IX别是cerr没冇缓 冲,发送给它的任何输出立即被执行,而clog只有、“|缓 冲区满时才有输出。缺省时,C+标准流被连到控制台 上。第13伞5 C+13.3.2基本I/O操作1 输出一入符“vv 的左操作数为标准输出流对象,右操作数为 待输出的某类型值。例如:coutwHello! nw; 输出Hello!,并换彳j:这时“vv为7申或char*插入符。插入运算符返回所 调用的ostream对象的引用,由于为左结合,所以可以 连写。第13秦5
16、C+2.输入一提取符“、 的左操作数为标准输入流,右操作数为行输 入量。它比scanf ()函数更紧凑,且可读性更好,也不 易出错。例如:cinx:从cin输入值到x。注意它与scanf ()函数不同,x前并没 何地址运算符,与插入符类似,提取符“也支持连 写。 程序员可以为自己定义的类(型)雄立相应的 插入和提取函数。第13車5 C+13.3.3格式化I/O1用iOS成员函数进行格式化Eiostream. h中,冇如下有关格式化标,也的枚举类 型定义:enumskipws=0x0001, 跳过输入中的它门字符left=OxOOO2, 输出数据庄对齐right=0x0004输出数据右对齐int
17、emal=0x(XX)8, 数据符号左对齐,数据本口右对齐 dcc=OxO() 0,转换奥数为十进制形式 oct=0x0020, 转换堆数为八进制形式 hex=0x0040, /转换基数为卜六进制形式 showbase=0x0080, 输出的数值数据全面带基数符号(0或Ox) showpoint=()xO 100,浮点数输出帯小数点 uppcrcasc=OxO2(X), 用大写字母输出十六进制数值 showpos=0x0400, 止数全lAj带号scientific=0x0800,浮点数输出采用科学表示法 fixed=Ox 1000, /浮点数输出采用定点熟形式 unitbuf=0x2000,
18、 /成操作后立即刷新缓冲区 stdio=0x4000 完成操作丿后刷新stdout, stderr h第13秦5 C+格式标志存放r 个long格数屮,要设置它可用 ios的sctf ()函数,其一般格式为:long sctf (long flags):该函数设置参数flags所指定的标志,返冋格式更 新前的标,忐。例如,耍设置showbase标,忐,可使用如 下语句:stream, setf (ios 11 showbase) :/其中 strea m 是所涉及的流实你上,还可以一次调用self ()來同时设 置多个标志。例如:cout.setf (ios: :showpos I ios:
19、: scientific);第13車5 C+清除标志可用unsetf ()函数,其原型与seif ()类 似。川flags ()函数町得到半前标志值和设置新标志, 分别具有以下两种原型:long flags (void):long flags (long Hags):除了标志外,格式输出还可设置域宽、填充字符及 输出精度。其原型分别为:int width (int len);char fill (char ch):int precision (int num);第13章C列C+请编译运行卜而这段程序:稈 include Hioslream.hirVoid maincout.setf (ios
20、: : showposl ios: scientific): cout 123 1232vvn” :cout.precision (2);cout.width (10);cou( 123 12325” :cout.fill (*#*);cout.width ( 10):coinvvl23vvvv23.12:)运行结果为:+123+1.2312c+O2+123+1.23c+O2nnn # # #+123+1.23+02输出结果:12342 用操作子进行格式化流类库所定义操作子如下:dec. hex, oct:数值数据采用I进制或I六进制、八进制表示.setbase (int n):设?i!数制转
21、换垦数为n (0、8、10、16. 0农 示便用缺省基数)。ws:提取空白符。ends:插入空字符。flush:刷新与流相关联的缓冲I*。resetiosflags (long ):消除参数所指定的林,忐位.setiosflags (long),设置参数所指定的标志位.setfill (int):设置填充字符。sclsprccision (int):设置浮点数输出的冇效数字个数。sclw(int),设置输出数据项的域釦第13車5 C+例如:int i=1234:coutselw (12) iendl;13.4类与对象13.4.1类的定义类的定义格式为:class类名public:成员函数或数据
22、成员的说明private:成员函数或数据成员的说明I:第13伞5 C+其屮,class是定义类的关键字。类名是一标识符, 通常用“T字母开始的了符串作为类名,T用来表示 类,以示与对象、函数名区别。花括匕内是类的说 明部分(包括前面的类头),说明该类的成员。第 13* C 列 C+例如,下面给出一个关于日期的类的定义。该类是 对日期抽彖,该类的对彖将是某个具体口期。H期类的说明部分:class TDatepublic:void SetDate (int y int m, int d);int IsLeap Year ():void Print (): private: int year, mo
23、nth, day;第13拿5C+类名为TDateo有三个公有成员.都是成员函数。SetDaie ()函数是设置日期的,用它来使对象获取值; IsLeapYear ()函数是个用来判断是否是闰年的函数: 返回值为1表示该年是闰年,返回值为0农示该年不是闰 年:print ()函数川來将年、丿J、H的具体值输出显 示。关丁这三个函数的功能通过下面的实现部分吋以看 lljo还冇三个私有成员,它们是ini型变址year、month 和day。该类共有六个成员。H期类的实现部分:void TDate11SetDate (int y, int m, int d)ycar=y: month=m: day=d:)int TDate: IsLeapYear ()return ( year%4=0&year% 100 !=0 )(year%400=0) : void TDate : Print ()coutycarw. M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论