北航软件所孙自安_第1页
北航软件所孙自安_第2页
北航软件所孙自安_第3页
北航软件所孙自安_第4页
北航软件所孙自安_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、C+与C北航软件所孙自安北航如心楼606电话:82316284Email: 1 第四章 面向对象的程序设计(续)2class Person public:protected:char * name;int age;classStudent : public Person public:private:char * school;char *class;intid;class Employee: public Person public:private:char * company;char *job;doublesalary;如何定义代培生?是一名职员是一名学生4.7 多继承3多继承:一个派生

2、类有两个或者两个以上的直接基类class EmployStud : public Student, public Employee public:private:bool way;逗号 , 隔开的多个基类4EmployStudliming;wayschoolnamecompanyname多个基类对象,二义性:有两个name/agePersonnameageEmployeecompanyjobsalaryStudentschoolclassidEmployStudway存储空间浪费不便于维护5虚拟继承:无论基类在派生层次中出现多少次,只有一个共享的基类子对象被继承。class Student :

3、 virtual public Person ;class Employee: public virtual Person ;class EmployStud : public Student, public Employee ;EmployStudliming;wayschoolcompanynamevirtual可在继承关键字之前或之后6IBM库的头文件:stringliststackMicrosoft库的头文件:vectorqueuestackvoid main( )/使用数据类型list和queue/包含IBM库的头文件/包含Microsoft库的头文件造成stack定义冲突4.8 名

4、字空间7名字空间定义格式:namespace 空间名 /成员定义所有可以出现在全局域中的声明都可以放在用户声明的名字空间中:类定义、变量声明或定义、函数声明或定义。名字空间括起来的区域称为名字空间域,出现在名字空间域中的各种声明或定义只能在该域中直接使用8cstring.hnamespaceMyString class CString ;CString & operator + ( const char *, CString & );cstring.cppnamespaceMyString CString:CString ( ) CString & operator + ( const cha

5、r *str1, CString & str2 )注意:名字空间的定义不一定是连续的,可以放在不同文件中。对外接口实现9注意:名字空间可以嵌套定义mylib.hnamespaceMyLib class CString ;namespaceMathLib class Complex ;namespaceGraphicLib classCircle ;10名字空间的使用(1):空间名:成员名域操作符#include “mylib.h”void main ()CString str ( “hello”);MyLib:CString str (“hello”);MyLib:GraphicLib:Cir

6、cle cir;11名字空间的使用(2):定义名字空间别名#include “mylib.h”namespacegraph = MyLib:GraphicLib;void main ()graph:Circle cir;12名字空间的使用(3):using 空间名:成员名;#include “mylib.h”using MyLib:GraphicLib:Circle;using MyLib:CString;void main ()CString str;Circle cir;13名字空间的使用(4):using 空间名;#include “mylib.h”using MyLib;void ma

7、in ()CString str;Circle cir;Complex cp;14class iStack public:bool pop( int &top_value );bool push( int value );bool full();bool empty();int value;iStack st;if(!st.push(value)cout“Empty”;if(!st.push(value)错误处理和正常操作混在一起4.9 异常(Exception)处理15异常是程序可以检测到的、运行时刻不正常的情况异常处理定义:定义异常类型抛出异常捕获异常处理异常16异常类型:用来定义出错信息

8、,可以是用户自定义类型或者内置数据类型。statckError.hclassStackError public:StackError ( int i = 0, int v = 0): state (i), value(v) int value ( ) return value; int state ( ) return state; private:int state;/0:ok, 1:full, 2:emptyint value;/试图将value压入堆栈; 17抛出异常:throw 异常对象;异常类型的一个实例class iStack public:/ 不再返回一个值void pop( i

9、nt &value );void push( int value );#include “stackError.h”void iStack:push( int value )if ( full() )StackError error (1, value);throw error;throw StackError(1,value);执行throw语句后,便抛出一个异常,程序将从抛出异常位置退出18捕获和处理异常:try /包含throw语句catch ( 异常类型1 对象 ) /处理一种异常catch ( 异常类型2 对象 ) /处理另一种异常throw语句必须在try块中。如果throw抛出的

10、异常对象类型与catch后括号内的异常类型一致,则程序执行该catch后的子句19try int value;iStack st;st.push(value);st.pop(value);st.push(value);catch ( StackError err ) int st = err.state();if (st = 1)else if ( st = 2 )else正常操作与错误处理操作的分离20异常处理步骤:try块中如果没有异常抛出,则正常执行,并忽略后面的catch子句。若try块中有异常抛出,则程序从抛出位置退出;若抛出的异常对象类型与try块后的某个catch声明类型匹配,则

11、执行该catch子句处理异常;处理完异常后,程序将从catch子句列表后的语句继续执行。若找不到匹配项,则该函数带着一个异常退出,继续检查函数调用点是否有try/catch子句。bool buidStack ( )try /push操作catch (StackError err )return 1;return 0;void clearStack ( )/pop操作void main ()try buildStack();clearStack();catch (StackError err ) 21重新抛出异常:在异常处理过程中也可能存在单个catch 子句不能完全处理异常的情况,必须由函数调

12、用链中更上级的函数来处理,那么catch子句可以通过重新抛出该异常,把异常传递给函数调用链中更上级的另一个catch子句。格式:throw;bool buidStack ( )try /push操作catch (StackError err )throw;return 1;void main ()try buildStack();catch (StackError err ) 抛出的仍然是接受到的err22捕获所有异常:catch ( ) char * str = new char100;delete str;有可能出现各种各样的异常try catch ( ) delete str;throw

13、;23#include void main() cout str;4.10 输入、输出流24库中提供了以下类的定义:istream类 (输入流)ostream类(输出流)iostream类(派生自istream和ostream,输入/输出流)同时该库定义了如下对象:cin : istream类对象,代表标准输入;cout :ostream类对象,代表标准输出;cerr :ostream类对象,代表标准错误输出。25输出:重载的左移操作符 输出操作符可以接受任何内置数据类型的实参;可以连续输出多个数据。能否输出类对象的信息?class Person public:private:char * n

14、ame;int age;ostream & operator ( ostream & out );friend ostream & operator (ostream &out, Person & one );26ostream & operator (ostream &out, Person & one )out “t” one.age;return out;Person li, wang, zhang;cout li wang 注意:当右操作数与实际输入数据类型不一致时,读入失败,返回false。比输出更容易出错。缺省情况下,以空格、换行、制表符作为分隔符,并丢弃掉。in

15、t ivalue;cin ivalue;/当输入小数或字符串时便出错if ( cinivalue )28char ch;while ( cin ch );a b cd/忽略空格和换行符/读入四个字符操作符noskipws 使输入操作符不跳过空白字符:char ch;cin noskipws;while ( cin ch );cin skipws;/读入七个字符29303132其它的输入/输出操作:istream成员函数:get ( )getline ( )read ( )peek ( )ostream成员函数:put ( )write ( )33下列三种类类型提供了文件支持ifstream 从

16、istream派生,把一个文件绑到程序上,用来输入ofstream 从ostream派生,把一个文件绑到程序上,用来输出fstream 从iostream派生,把一个文件绑到程序上用来输入和输出。为了使用文件流组件,我们必须包含相关的头文件#include 由于在fstream 头文件中也包含了iostream 头文件,所以我们不需要同时包含这两个文件4.11 文件操作34为了打开一个仅被用于输出的文件,我们可以定义一个ofstream 类对象,例如ofstream outfile( copy.out, ios_base:out );注意:输出模式ios_base:out 或附加模式ios_b

17、ase:app,缺省为输出模式;ofstream从ostrearn 类派生,所以所有ostream 操作都可以应用到一个ofstream 类对象上。outfile“hello, world”endl;为了打开一个仅用于输入的文件,我们可以使用ifstream 类对象,例如:ifstream infile ( “input.txt”);35在定义ifstream 和ofstream 类对象时,我们也可以不指定文件,以后可以通过成员函数open()显式地把一个文件连接到一个类对象上,例如ifstream curFile;cur( “input.txt” );我们可以通过成员函数close()断开一个文件与程序的连接,例如cur();36fstream类对象可以打开一个被用于输出或者输入的文件,例如:fstream io( word.out, ios_base:in|ios_base:app );seekg()或seekp()成员函数分别用于定位读、写位置。37作业1(必作,6月28日前交):C+标准库中提供了支持各种字符串操作的string类,使用前要包含头文件:#include 要求:通过查阅资料或帮助文件自学string类,包括该类提供的各种操作。定义一个类Uppe

温馨提示

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

评论

0/150

提交评论