面向对象程序设计复习题_第1页
面向对象程序设计复习题_第2页
面向对象程序设计复习题_第3页
面向对象程序设计复习题_第4页
面向对象程序设计复习题_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、复习题(一)一、判断题(每题1分,共10分)1将数据和对数据的操作相结合,形成一个有机的整体,体现了类的封装。2类和普通变量不同,可以先使用,后定义。3类的static数据成员要在文件作用域内进行定义性说明。4可以以”类名: 静态成员函数(实参表)”的形式调用类的静态成员函数。5类定义中,默认的访问权限是private。6函数参数是对象的引用时,调用该函数进行参数传递时要调用复制构造函数。7运算符重载体现了类的多态性。这种多态是在运行时完成的。8在多层虚拟继承中,如果虚基类没有默认的构造函数,则派生类构造函数的成员初始化列表中应该对列出直接基类和底层的虚基类的初始化。9iostream是由is

2、tream和ostream共同派生的。10在try块中抛出异常后,程序控制不会再执行try块中的后续语句。 二、选择题(每题1分,共10分)1类O定义了私有函数F1。P和Q为O的派生类,定义为class P: protected O; class Q: public O。_可以访问Fl。A O的对象B P类内 C O类内D Q类内2设p是指向一个动态申请对象的指针,则delete p;后,将调用_。A 构造函数B复制构造函数 C 析构函数D系统指定的成员函数3A为类。pa是指向A类对象的指针。pf是指向A类成员函数int f()的指针。则通过pa和pf调用f函数的正确形式是_。A pa->

3、;pf() B pa->*pf() C (pa->pf)() D (pa->*fp)()4在表达式-(x*y)中,”-”作为成员函数重载,”*”作为友元函数重载。则正确的描述是_。A operator-()有一个参数,operator*()有一个参数。 B operator-()有一个参数,operator*()有两个参数。C operator-()没有参数,operator*()有一个参数。 D operator-()没有参数,operator*()有两个参数。5对new运算的错误描述是_。A动态创建对象成功时,返回的是对象名。 B动态创建对象时,要调用类的构造函数。C动态

4、创建的对象可以用delete运算将其释放。 D动态创建对象生命期不受块和函数作用域的限制。6当一个类的某个函数被说明为虚函数时,该函数在该类的所有派生类中_。A 都不是虚函数。 B 都是虚函数。 C 必须重新说明后才是虚函数。D 必须加上virtual,同时重新说明后才是虚函数。7主函数如下。则正确的求3个数中最小的数的函数模板MIn定义是_。void main()cout<<Min(10,3,5)<<endl; cout<<Min(3.4,5.6,10.0)<<endl; cout<<Min('b','a&#

5、39;,'c')<<endl; A template<typename T1,typename T2>T2 Min(T1 a,T1 b,T1 c) T2 t=a<b? a:b; return t<c?t: c; ;B template<typename T>T Min(T a,T b,T c) T t=a<b? a:b; return t<c?t: c; ;C template<typename T>T Min(T a,T b,T c) int t=a<b? a:b; return t<c?t:

6、 c; ;D template<typename T> Min(T a,T b,T c) T t=a>b? a:b; return t>c?t: c; ;8下列关于纯虚函数和抽象类的描述中错误的是_。A 纯虚函数没有具体的实现。 B 抽象类的派生类一定是非抽象类。C 抽象类只能作为基类使用,不能实例化。 D 包含有纯虚函数的类称为抽象类。9下列关于异常处理的描述错误的是_。A throw语句必须在try语句块中直接运行或通过调用函数运行。 B throw语句抛出的异常可以不被捕获。C 一个程序中可以有try语句,而没有throw语句。 D一个程序中可以有try语句,而没

7、有catch语句。10下列关于流的叙述中 _ 是错误的。A cin是输入流,可以用其输入字母、数字、回车等各种键盘符号。B 使用文件流对象时,要使用#include <fstream>编译预处理语句。C C+将每个文件看成是一个有序的字节流。 D 无论是文本文件还是二进制文件都有读写指针。三、概念填空题(每空1分,共10分)在C+中“流”是表示数据从一个对象到另一个对象的传送。从流中取得数据称为 1 ,用符号 2 表示;向流中添加数据称为 3 ,用符号 4 表示。 使用文件进行输入/输出时,系统需要读入数据时是从 5 文件读入,即 6 操作。而系统要写数据时,是写到 7 文件中,即

8、 8 操作。通常标准输入设备指 9 。标准输出设备指 10 。四、程序填空题(每空2分,共30分)1CData为日期类。CData类重载了+、-运算符,实现CData对象加减天数;重载插入运算符<<为友元函数,以”年-月-日”形式输入日期。#include<iostream>using namespace std;class Data int year,month,day; bool IsLeapYear(int y) /判断年份是否为闰年 return (year%400=0 | 1 ); 2 int days212; public: Data(int y=0,int

9、 m=0,int d=0)year=y;month=m,day=d; Data operator+(int); Data operator-(int); 3 ostream& operator<<(ostream&, Data&);Data Data:operator+(int d) /+运算符重载,d表示要加的天数 Data dt=*this;int leap=IsLeapYear(dt.year); d+=dt.day; while(d>daysleapdt.month-1) d-=daysleapdt.month-1; if(+dt.month=

10、13) dt.year+; dt.month= 4 ; leap= IsLeapYear ( 5 ); dt.day=d; return dt; Data Data:operator-(int d) /-运算符重载,d表示要减的天数 Data dt=*this;int leap= 6 (dt.year); d=dt.day-d; while(d<1) if( 7 dt.month=0) dt.year 8 ; dt.month=12; leap=IsLeapYear(dt.year); d 9 daysleapdt.month-1; dt.day=d; return dt; ostrea

11、m& operator<<(ostream& out,Data& dt) out<<dt.year<<"-"<<dt.month<<"-"<<dt.day<<endl; 10 ; int Data:days212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;2写出下面程序运行的结果。class CATpublic:CAT();CAT(CAT&

12、); CAT(); int GetAge() return *itsAge; void SetAge(int age) *itsAge=age; protected: int * itsAge; ;CAT:CAT() itsAge=new int; *itsAge=5; CAT:CAT(CAT& cat) itsAge=new int; *itsAge=*(cat.itsAge); CAT:CAT() delete itsAge; itsAge=NULL; void main() CAT a; cout<<"age="<<a.GetAge()

13、<<endl; a.SetAge(6); CAT b(a); cout<<"age="<<a.GetAge()<<endl; cout<<"age="<<b.GetAge()<<endl; a.SetAge(7); cout<<"age="<<a.GetAge()<<endl; cout<<"age="<<b.GetAge()<<endl; 11 12 13 1

14、4 15 五、简答题(每题5分,共10分)1用最简练的语言解释下列词汇在面向对象程序设计中的含义:对象,类,方法,接口,消息,封装,继承,服务2简要回答下列问题:(1)什么是多态性?什么是重载?编译系统是如何实现重载的?(2)什么是函数重载?编译系统如何区分同名函数的不同版本?(3)若基类中定义了成员函数f1(),其公有派生类中是否一定要重定义f1()?派生类重定义的基类成员函数是否由参数区分?(4)为什么友元运算符重载不能使用缺省参数?六、程序设计题(每题15分,共30分)1声明基类abstract,有成员函数fn1()和fn2(),fn1()是虚函数。从abstract公有派生entity

15、类。entity类也有同名成员函数fn1()和fn2()。在主函数中声明一个entity的对象和声明abstract类和entity类的指针,两个指针都指向entity的对象,并通过这两个指针分别调用fn1() 和fn2()函数。abstract类的fn1()函数定义virtual void fn1()cout<<” abstract fn1()”<<endl; abstract类的fn2()函数定义void fn2()cout<<” abstract fn2()”<<endl; entity类的fn1()函数定义 void fn1()

16、cout<<” entity fn1()”<<endl;entity类的fn2()函数定义 void fn2()cout<<” entity fn2()”<<endl;完成如下设计:基类abstract的定义;派生类entity的定义;主程序的定义及程序运行结果。2自定义字符串类CString如下。class CStringpublic: CString(const char *str = NULL)/ 构造函数 CString(const CString &other) / 复制构造函数 CString() / 析构函数 bool op

17、erator<(const CString &other)/<运算符重载函数private: char *m_data/字符指针,指向动态申请的内存,该内存存放字符串。;CString:CString(const char *str)/ 构造函数 if(str=NULL)m_data=new char1; *m_data=0; else m_data=new charstrlen(str)+1; strcpy(m_data,str); 设计如下函数: CString(const CString &other)复制构造函数; CString()析构函数;bool op

18、erator<(const CString &other)运算符重载函数。“<”的含义为按ASCII码比较*m_data的大小。复习题(二)一、 判断题(每题1分,共10分)1类是对象的抽象。2类的析构函数无类型、无参数,不能重载。3派生类不能继承基类的构造函数。4int (*Fun)()中Fun表示是一个函数名。5系统生成的缺省的复制构造函数只能完成对象的浅复制。6所有运算符都可以重载为成员函数和友元函数。7要实现运行时多态,必须使用基类指针调用虚函数。8建立派生类对象时,基类构造函数执行顺序由派生类构造函数的初始化列表顺序确定。9函数void f(int) throw(

19、)表示f可以抛出任何异常类型。10cin只能接收除空白符之外的字符,而get()函数可以接收空白符字符。二、 选择题(每题2分,共20分)1 类的“同一接口,多种方法”体现了类的_特征。A多态B封装 C继承D抽象2 设A为类,则A *(*fpA5)()的正确描述是_。A fpA是一个数组,数组元素是A类对象。B fpA是指针数组,数组元素是A类对象的指针。C fpA是指针数组,每个元素是一个无参函数的地址,函数返回A类对象。D fpA是指针数组,每个元素是一个无参函数的地址,函数返回A类对象地址。3 _是对this指针错误的描述。A *this表示调用成员函数的对象。 B 调用类的非静态函数都

20、隐含使用了this指针。C 在程序中可以将对象的地址赋给this指针进行。 D this->X和(*this).X的作用相同,都是访问对象的X成员。4 类声明如下,类中的成员a属于_。class A char a; public: A(char n):a(n) ; A 公有数据成员B保护数据成员 C 私有数据成员D私有函数成员5 下列关于new运算的错误描述是_。A new运算创建的对象存放在动态区。 B new运算创建对象时不会调用类的构造函数。C new运算的可以重载。 D 释放new运算创建的对象需要调用析构函数。6 B类是A类的公有派生类, B类和A类都定义了虚函数f()。p是一

21、个A类的指针。则p-> f()的操作是_。A 根据p所指的对象类型来确定调用的函数。 B 调用B类中的f()函数。C 调用A类中的f()函数。 D 该操作错误。7 关于虚函数的正确描述是_。A 抽象类中的成员函数都是虚函数。B 只能通过指针和引用调用虚函数。C 含有虚函数的类不能实例化。D 虚函数不能是静态函数。8 虚基类解决了多继承中的_。A 封装性B二义性 C多态性D提高运行效率9 文件中有3个指针,ios:beg、ios:end、ios:cur。能够读写的指针是_ 。A ios:begB ios:end C ios:curD ABC10 设A为抽象类,则正确的说明语句是 。A A

22、aB A fun(int) C int f(A)D A *p三、 概念填空题(每空1分,共10分)1 打开文件后,系统就为文件建立了文件指针。在 1 类中定义了3个文件指着:ios:beg指向文件的 2 ,ios:end指向文件的 3 ,ios:cur指向文件的 4 。在istream和ostream中定义了一些函数可以来改变 5 指针的位置,每次读/写操作后, 6 指针的位置会发生改变。2 运算符重载时,其函数名由 7 和运算符共同构成。双目运算符重载为类的成员函数时,函数需要 8 个参数。这时双目运算符的左操作数是 9 ,右操作数是 10 。四、 程序填空题(每空2分,共30分)1 填空及

23、写出程序运行的结果。#include<iostream>#include<cstring>using namespace std;class book char *Bookname, *Author;public: book(char*,char*); book(book&); book(); virtual void print();book:book(char *bookname,char *author) Bookname = new charstrlen(bookname)+1; strcpy(Bookname, 1 ); Author =new cha

24、rstrlen( 2 )+1; strcpy(Author,author);book:book() 3 ; delete Author;book:book(book& rb) Bookname=new charstrlen(rb.Bookname)+1; strcpy(Bookname,rb.Bookname); Author =new charstrlen(rb.Author)+1; strcpy(Author,rb.Author);void book:print()cout<<Bookname<<endl;cout<<Author<<

25、endl;class series:public book char *Sername; int Volume;public: series(char*, char*, char*,int); series(book&, char *,int);series(); void print();series:series(char *bookname,char *author, char *sername,int volume):book(bookname,author) Sername=new charstrlen(sername)+1; strcpy(Sername,sername);

26、 Volume=volume;series:series(book &bk, char *sername,int volume): 4 Sername=new charstrlen(sername)+1; strcpy(Sername,sername); Volume= 5 ;series:series()delete Sername;void series:print() 6 ; /调用book类的print()函数 cout<<Sername<<endl; cout<<Volume<<endl;void main() book a(&

27、quot;C+","Wu"); series b(a,"TP312C",5); b.print();_7_8_9_10_2 为学生类重载插入、提取和小于运算符。小于的含义是比较key的大小。class student int key; string name;public:bool operator<(student&); friend ostream & operator<<(ostream&,const student&)/输出学生数据 friend istream & operat

28、or>>(istream&,student&);/输入学生数据;ostream & operator<<(ostream& out,const student& stu) 11 ; 12 ;istream & operator>>(istream& in,student& stu) 13 ; 14 ;bool student:operator<(student& stu)return 15 ;五、简答题(每题5分,共10分)1试列举过程化、模块化、结构化等程序设计方法的主要特点。面

29、向对象程序设计是如何包容和吸收其它几种程序设计方法的有用成分的。2简要回答下列问题:(1)什么是多态性?什么是重载?编译系统是如何实现重载的?(2)什么是函数重载?编译系统如何区分同名函数的不同版本?(3)若基类中定义了成员函数f1(),其公有派生类中是否一定要重定义f1()?派生类重定义的基类成员函数是否由参数区分?(4)为什么友元运算符重载不能使用缺省参数?六、 程序设计题(每题15分,共30分)1 设计如下类:CShape抽象类。CShape有2个纯虚函数virtual double area()和 virtual double volume(),没有数据成员。CShape公有派生矩形类

30、CRectangle。CRectangle新增数据成员double width和length。给出了基类虚函数的实现,分别返回矩形面积和体积。并设计CRectangle类的构造和复制构造函数。CRectangle公有派生立方体类CBox。CBox新增数据成员double height,改写virtual double volume()返回立方体体积。并设计CBox类的构造和复制构造函数。2 自定义字符串类CString如下。class CStringpublic: CString(const char *str = NULL);/ 构造函数 CString(const CString &

31、;other); / 复制构造函数 CString &operator+=(const CString &other);/+=运算符重载函数 CString(); / 析构函数private: char *m_data;/指向存放字符的动态区首址;CString:CString(const CString &other) delete m_data; m_data=new charstrlen(other. m_data)+1; strcpy(m_data,str);设计如下函数: CString(const char *str = NULL)构造函数; CString

32、()析构函数; CString &operator+=(const CString &other)运算符重载函数。实现CString对象的字符串自加other的字符串。 复习题一答案一、判断题(每题1分,共10分)12 3456 78 910×××二、选择题(每题1分,共10分)1234 56 78910BCCDDABBDA三、概念填空题(每空1分,共10分)1提取2>>3插入4<<5输入6读7输出8写9键盘10显示器四、程序填空题(每空2分,共30分)year%4=0 && year%100!=02stat

33、ic3friend415dt.yearIsLeapYear7-8-9+=10return outage=512age=613age=614age=715age=6五、简答题(每题5分,共10分)1 用最简练的语言解释下列词汇在面向对象程序设计中的含义:对象,类,方法,接口,消息,封装,继承,服务答:对象是客观世界中的实体在计算机中的表示。是一组数据成员和方法成员的封装体。是类类型的实例。类是一种抽象数据类型。是一组对象共性的描述。方法是在一个类中定义的过程或函数,实现类的功能的代码。接口是对象封装体向外部公布的一组具有公有属性的方法。是从对象外部与对象通信的唯一途径。消息是对象之间的通信机制,

34、对象的客户通过接口方法调用请求对象服务称为消息调用。对象之间通过消息传递,互相协调、配合,共同实现软件系统的整体设计目标。消息的载体是对象提供的公有方法,即对象的接口。封装有以下两重含义:首先,是指将描述客观实体数据特征的数据和方法特征的代码组织在一起,作为一个整体,并为该整体命名标识,以区别于其它数据和程序代码。其次,通过对该整体内成员的访问属性的规定,使一部分成员的隐藏起来,对于封装体外成为不可见的,同时使另一部分成员对外开放,作为与外部交流的接口。继承是面向对象程序设计方法中描述的两个类之间一种增量包含关系。这两个类具有一种父子关系,子类通过为父类添加新的成员而创建。继承提供了利用一个类

35、的代码创建新类的重用方法。继承关系也是对客观世界分类层次关系的一种模拟。服务即对象通过公有方法向外部提供功能。2简要回答下列问题:(1)什么是多态性?什么是重载?编译系统是如何实现重载的?(2)什么是函数重载?编译系统如何区分同名函数的不同版本?(3)若基类中定义了成员函数f1(),其公有派生类中是否一定要重定义f1()?派生类重定义的基类成员函数是否由参数区分?(4)为什么友元运算符重载不能使用缺省参数?答:(1) 多态性指程序对同一名字或符号在不同情况下做出不同解释的能力。比如两次调用一个同名函数时却执行的是不同的代码。将程序名与其对应的代码块联系起来的行为称为绑定。编译时完成的绑定称为静

36、态绑定,程序运行期间完成的绑定称为动态绑定。编译系统通过静态绑定实现多态性。(2)程序编译时实现的多态性属于静态的多态性,静态的多态性又叫重载(overload),编译时如果遇到名称相同但参数不同的函数,系统把它们看做不同的函数分别联系到不同的执行代码块的首地址。程序运行时根据同名函数调用时的实参不同而调用不同的代码。(3)派生类中可出出重定义(override)也可出不重定义基类中已有定义的成员函数,派生类重定义的基类成员函数时,应具有和基类中重定义函数相同的函数原型,而不是由参数区分。(4) 因为友元运算符(函数)不是类的成员,所以,函数的参数表中没有隐含的this指针,所以,友元运算符重

37、载没有缺省参数可以使用。六、程序设计题(每题15分,共30分)1每1小题5分,共15分。1.1 正确写出abstract类及2个函数得5分,写错其中一项扣2分,其他错误扣1-2分,类定义中没有虚函数不得分。#include <iostream>using namespace std;class abstractpublic:virtual void fn1()cout<<"abstract fn1()"<<endl;void fn2()cout<<"abstract fn2()"<<endl;1

38、.2 正确写出entity类及2个函数的定义得5分,写错其中一项扣2分,其他错误扣1-2分,类定义中没有2个虚函数的实现不得分。class entity:public abstractpublic:void fn1()cout<<"entity fn1()"<<endl;void fn2()cout<<"entity fn2()"<<endl;1.3正确写出main函数及2类指针及应用,正确写出运行结果得5分,写错其中一项扣2分,其他错误扣1-2分,没有使用指针访问2个函数和指针类型错误不得分。void m

39、ain()entity en1,*pe=&en1;abstract *pa=&en1;pa->fn1(); pa->fn2();pe->fn1(); pe->fn2();程序运行结果entity fn1()abstract fn2()entity fn1()entity fn2()2每1小题5分,共15分。2.1 正确写出CString类构造函数定义得5分, 写错new或没有new,写错strcpyw或没有strcpy,或没有return扣2分,其他错误扣1-2分,全部错误不得分。CString:CString(const CString &ot

40、her)m_data=new charstrlen(other.m_data)+1; strcpy(m_data, other.m_data);2.2 正确写出CString函数得5分,delete后无扣2分,其他错误扣1-2分,没有写出delete不得分。CString: CString()delete m_data;2.3 正确写出<函数得5分,无strcmp或没有strcmp,写错return或没有return各扣2分,其他错误扣1-2分,全部错误不得分。bool CString:operator<( const CString &other) int n=strcm

41、p(m_data , other. m_data); return (n<0 ? 1 : 0);复习题(二)参考答案一、判断题(每题1分,共10分)12345 678910××××二、选择题(每题1分,共10分)12345 678910ADCCBADBCD三、概念填空题(每空1分,共10分)1ios2头3尾4当前位置5ios:cur6ios:cur7operator819调用函数的对象10函数参数四、程序填空题(每空2分,共30分)1bookname2author3delete bookname4book(bk)5volume6book:print

42、()7C+8WU9TP312C10511out<<stu.Key<< stu. name12return out13in>>stu.Key>>>>stu. name14return in15return key<stu.key五、简答题(每题5分,共10分)1试列举过程化、模块化、结构化等程序设计方法的主要特点。面向对象程序设计是如何包容和吸收其它几种程序设计方法的有用成分的。答:过程化程序设计方法以过程或函数作为程序的基本构造单位。侧重于算法表达和过程间参数传递的组织。模块化程序设计方法以独立编译的源程序模块作为大型应用程序的

43、基本组织单位。注重于应用程序的开发管理。包括系统开发的任务分解、模块间通信管理、可重用代码库的组织、由不同语言生成的目标模块的连接等方面。结构化等程序设计方法以单入口单出口的可嵌套基本控制结构作为程序构造单位。提倡自顶向下的分析和自底向上的设计相结合的软件系统构造方法。重点关注程序结构清晰,以获得程序的可理解性和可维护性。面向对象程序设计方法包容了以上三种方法的所有积极成分。对象中包含的方法实际上就是过程或函数,方法的参数传递与过程或函数的传递都是利用堆栈进行的。在方法的实现时仍然用单入口单出口的基本控制结构编程。系统构造仍然使用自顶向下的分析和自底向上的设计过程。并用模块化方法管理整个系统的

44、开发,整个软件系统由若干独立编译的源程序文件组成。面向对象方法对于以前程序设计方法的质的跃变在于将中算法与数据结构的多对多依赖变成了相互间的单一依赖关系。2简要回答下列问题:(1)什么是多态性?什么是重载?编译系统是如何实现重载的?(2)什么是函数重载?编译系统如何区分同名函数的不同版本?(3)若基类中定义了成员函数f1(),其公有派生类中是否一定要重定义f1()?派生类重定义的基类成员函数是否由参数区分?(4)为什么友元运算符重载不能使用缺省参数?答:(1) 多态性指程序对同一名字或符号在不同情况下做出不同解释的能力。比如两次调用一个同名函数时却执行的是不同的代码。将程序名与其对应的代码块联系起来的行为称为绑定。编译时完成的绑定称为静态绑定,程序运行期间完成的绑定称为动态绑定。编译系统通过静态绑定实现多态性。(2)程序编译时实现的多态性属于静态的多态性,静态的多态性又叫重载(overload),编译时如果遇到名称相同但参数不同的函数,系统把它们看做不同的函数分别联系到不同的执行代码块的首地址。程序运行时根据同名函数调用时的实参不同而调用不同的代码。(3)派生类中可出出重定义(override)也可出不重定义基类

温馨提示

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

评论

0/150

提交评论