《C++面向对象程序设计》期末考试试题_第1页
《C++面向对象程序设计》期末考试试题_第2页
《C++面向对象程序设计》期末考试试题_第3页
《C++面向对象程序设计》期末考试试题_第4页
《C++面向对象程序设计》期末考试试题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、C+面向对象程序设计考试试题本试卷满分 100 分; 请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰; 请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸 一并交上来。一、单选题 (共10分,每题 1分)1. C+中解决命名冲突的机制是:D(A) 虚基类 (B) 虚函数 (C) 函数重载2. 若类A的一个对象所占的内存空间中包含虚函数表的入口地址(A) 类 A 不能有静态数据成员(C) 类 A 中至少有一个成员函数是虚的 3任意一个类,析构函数的个数最多是:(A) 不限个数 (B)1(C)4 下列关于 this 指针的说法 ,哪个是正确的(A) this

2、指针一定指向常量型数据(C) 静态成员函数中也可以访问(B)(D)(D) 名字空间,则: C类A中公有的成员函数一定是虚的 类A的析构函数一定是虚的(D) 35在类定义中 , 为说明成员的访问权限(A) 次数没有具体限定(C) public 至少一次 面哪种定义方式是正确的,并且使得(A) A * p = new A;(C) const A* p = new A;obj 是类 A 的一个对象,执行语句(A) 类 A 的拷贝构造函数会被调用(C) &aA 的值就是 &obj67(B) this 指向的数据不可更改(D) this 指针本身可直接作为成员函数的返回值 Athis 指针, priva

3、te, protected, public 可以出现次数为: (B) 每种至多一次 (D) 每种至少一次p 可以作为函数 void f( A* const pp); 的实参: A (B) A a; A* p = a;(D) A a; const A* p = a;const A& aA= obj; ,则下列说法正确的是: C (B) 类 A 的赋值函数会被调用(D) 语句 obj.f( ) ;等价于语句 aA.f( ) ;面关于访问类 A 的私有数据成员的说法,错误的是:(A)(B)(C)(D) 9类 A8类A类A类A类A的友元函数可以访问类 A 的私有成员。 的友元类中的非静态成员函数可以访

4、问类 的嵌套类中的非静态成员函数可以访问类 中的非静态成员函数可以访问类 A 的私有成员。的私有成员。 的私有成员。中有唯一的一个成员函数f,且f是公有的静态或非静态成员函数,对于类 A的一f 的函数原型不可以是: B(B) void f(int& ) ;(D)A f( const int&);A个对象a,执行语句a.f(100);成功,那么(A) A& f( int, int=50 );(C) const A * f(const int );10. 下面关于类的成员函数描述不正确的是:(A) 静态成员函数内可以直接访问类的非静态成员数据(B) 静态成员函数内可以直接访问类的静态成员数据(C)

5、 非静态成员函数可以直接访问类的非静态成员数据(D) 非静态成员函数可以直接访问类的静态成员数据(全局成员)二、判断正误,对于你认为错误的论述,说明原因或举出反例。(每题2分,共20分)1. 重载流操作符 时,如果第一个参数的类型为ostream和istream,那么这个重载函数既可以用于标准输入输出流,也可以用于文件流上。对,ostream和istream是标准输入输出流、文件流、字符串流的基类2. 在同一个类中,可以定义重载的成员函数void f(int);和virtual void f(int);。错,这属于重复定义3. 抽象类不会产生实例,所以不需要有构造函数。错,被派生时需要它的构造

6、函数4. 类A有一个非静态的成员函数f,其函数原型是:void A:f( ) con st,则该函数被调用时,一定是通过类 A或类A的某后裔类的一个用const修饰符说明的常量对象调用的。错,常函数可以由变量对象或常量对象调用5. 异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。错,可以在外层捕获,并且这是最常见的用法6. 只要程序中没有A a1 = a2;和A a1(a2);形式的代码,类A的拷贝构造函数就不会被调 用。错,参数传递或函数返回时也调用拷贝构造函数7. 在protected继承方式下,派生类对象的指针不能直接转换成指向基类对象的指针。 对,否则基类中的公有成员由

7、不可见变为可见,权限被放大8. 若静态成员函数中调用了一个函数f,那么f 一定不是虚函数。对,静态成员函数不能是虚函数,因为虚函数入口需要在保存在对象中的虚函数 表中,而静态成员函数不属于对象。9. 若要实例化一个含有引用型数据成员的类,那么只能使用构造函数初始化列表来初始化该 数据成员。对,没有别的办法10. 构造函数的函数体中,不能使用return语句;但在实现该类的自动类型转化函数时,必须有return语句。对、回答下列各题(每题 4分,共20分)1. 举例说明static关键字的用法和相应目的(至少3种)。f() static int a;函数体内的静态变量,每次调用该函数时值保持不变

8、 static int a;全局的静态变量,约束作用域为所在文件class A static int a; A的静态成员,类似全局变量,需用A:a访问2. 举例说明类的数据成员在哪些情况下必须在初始化列表中进行初始化(至少3种)。基类不提供无参的构造函数成员对象不提供无参的构造函数有常量成员或引用成员3. 举例说明虚拟继承的作用和目的。虚拟继承的目的是使基类在派生类中只保留一个副本从而避免二义性4. 举例说明成员函数 A& f( ) con st;和成员函数A& f();的区别。A& f( ) const是常函数,隐含的this指针是常指针,因此在f中不能修改对象成员的值。举例略5. 有类A的

9、对象a,任意给出一种解决方案,使得程序支持下面的表达式:a=10+a;class A A(i nt);/转换构造函数friend const A operator+(c onst A,c onst A); /重载+;四、指出下列程序代码中存在的错误或不足,说明原因。(每题5分,共10分)1 .#in cludeclass B:public Avoid mai n()class A public:public:A * p= new B;virtual A( ) virtual void g()p-f();virtual void f() coutB:g( )g(); coutA:f( )k();

10、virtual void g() coutB:k( )e ndl;delete p; coutA:g( )k();时要根据p的类型在A中查k的信息2.#in cludeclass A #in cludepublic:class A;A( ) class B:public A virtual void output( ) public:;B(const char* in fo)void mai n()m_buf= new char256;strcpy(m_buf,i nfo); A*pa = new B(hello!);B( ) delete m_buf; pa-output();virtual

11、 void output( ) cout m_buf; delete pa;private:char * m buf; ;答:A的析构函数应定义为虚函数,否则B的析构函数不会被调用,m_buf也不会被释放-4 -五、写出下面程序的运行结果(每题5分,共10分)1.#in elude class B:public A void mai n()class A public:public:B( ) -cou nt;Out( );A( ):co un t(1) virtual A* Copy( ) con stB b;virtual A( ) B *p = new B(*this);A* a1= &b

12、;virtual A* Copy() const = 0;+p-co unt;a1-Out();virtual void Out( ) const = 0;return p;a1 = a1-Copy();protected:a1-Out();int count;virtual void Out( ) constdelete a1;; cout count en dl; ; 答:12102.#in clude class A public:A(int n): num( n) Out( ); A(con st A& rhs): num(rhs .n um)Out( );void Out( ) co

13、ut num e ndl; public:int num;class B:public A public:B(A & a) :obj(a),A(1) void Out( ) obj.Out( ); private:A obj;void main( ) A a(8);B b1(a);B b2(b1);b2.Out();答:818188-5 -六、阅读下面两个类的定义和部分实现代码,完成3个问题。(共10分)#in cludeclass B int main()class A public:public:B(int n);B b1(1);A(int n):value( n) void Displa

14、y( ) constb1.Display();void Display( ) const aA.Display(); B b2(2);coutValue = valuee ndl; private:b2. Display();private:A aA;return 0;int value;1.3分实现类B的构造函数,使得程序的输出为:Value=1Value=2答:B(int n):aA(n)2. 3分若main函数中增加了语句 B b3(b1);针对本例,说明是否有必要以公有方式自定义并实现类B的拷贝构造函数,为什么?答:不需要,因为类 B及基类A中不存在引用或指针成员,使用默认的拷贝构造函

15、数就可 以。3. 4分在不改动类A和main函数的前提下,以继承的方式重新定义并实现类B,使得程序的输出结果不变。答:class B:public A public:B(int n):A(n);void Display( ) const A:Display(); ;七、(共20分,每问题10分)某程序员为了灵活地对各种的给定的曲线函数f(x)画出其曲线图形,设计并部分实现了一个曲线类curve,该类的成员数据中,count代表坐标点的个数,pxs代表的数组存放这些坐标点的横坐标,pys代表的数组存放利用f(x)计算得到的这些坐标点的纵坐标。由于不同曲线的计算公式f(x)是不同的,该程序员希望曲

16、线函数的种类可以通过继承curve类的方式任意增加,增加一个新的f(x)时不改变curve类中的内容,也不改变利用 curve类进行图形绘制的算法。已部分完成的curve类定义和实现如下:class curve public:void setPxs( ) /*把获取的横坐标数据存放在pxs代表的数组中,并为count置值*/ double* getPxs( ) const retur n pxs;int getCo unt( ) const retur n coun t;-6 -double* getPys( ) const ;private:double* pxs;double* pys;i

17、nt count;1、 请按照该程序员的设计意图给出成员函数getPys的完整实现。实现过程中,可以为curve类增加其它成员。可以假设setPxs函数已经完整实现,不需要考虑曲线的绘制和显示。答:class curve public:void setPxs( ) /*把获取的横坐标数据存放在pxs代表的数组中,并为 count置值*/ double* getPxs( ) const retur n pxs;int getCo unt( ) const retur n coun t;double* getPys( ) const ;virtual double f(double)=0;private:double* pxs;double* pys;int count;double* curve:getPys( ) constif(pys=NULL) pys=new doubleco un t;f

温馨提示

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

评论

0/150

提交评论