收藏 分享(赏)

《C++面向对象程序设计》期末考试试题.doc

上传人:精品资料 文档编号:7538092 上传时间:2019-05-21 格式:DOC 页数:6 大小:91.50KB
下载 相关 举报
《C++面向对象程序设计》期末考试试题.doc_第1页
第1页 / 共6页
《C++面向对象程序设计》期末考试试题.doc_第2页
第2页 / 共6页
《C++面向对象程序设计》期末考试试题.doc_第3页
第3页 / 共6页
《C++面向对象程序设计》期末考试试题.doc_第4页
第4页 / 共6页
《C++面向对象程序设计》期末考试试题.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

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

2、 A 中至少有一个成员函数是虚的 (D) 类 A 的析构函数一定是虚的3任意一个类,析构函数的个数最多是:B(A) 不限个数 (B) 1 (C) 2 (D) 34 下列关于 this 指针的说法 ,哪个是正确的: D(A) this 指针一定指向常量型数据 (B) this 指向的数据不可更改(C) 静态成员函数中也可以访问 this 指针 (D) this 指针本身可直接作为成员函数的返回值5在类定义中,为说明成员的访问权限,private, protected, public 可以出现次数为:A(A)次数没有具体限定 (B) 每种至多一次(C) public 至少一次 (D) 每种至少一次

3、6下面哪种定义方式是正确的,并且使得 p 可以作为函数 void f( A* const pp);的实参:A(A) A * p = new A; (B) A a; A* p = a; (C) const A* p = new A; (D) A a; const A* p = a;7 obj 是类 A 的一个对象,执行语句 const A ,则下列说法正确的是: C(A) 类 A 的拷贝构造函数会被调用 (B) 类 A 的赋值函数会被调用(C) 成功,那么 f 的函数原型不可以是:B(A) A (B) void f(int(C) const A * f(const int ); (D) A f(

4、 const int10. 下面关于类的成员函数描述不正确的是:A(A) 静态成员函数内可以直接访问类的非静态成员数据- 2 -(B) 静态成员函数内可以直接访问类的静态成员数据(C) 非静态成员函数可以直接访问类的非静态成员数据(D) 非静态成员函数可以直接访问类的静态成员数据(全局成员)二、判断正误,对于你认为错误的论述,说明原因或举出反例。 (每题 2 分,共 20 分)1. 重载流操作符 时,如果第一个参数的类型为 ostream 和 istream,那么这个重载函数既可以用于标准输入输出流,也可以用于文件流上。对,ostream 和 istream 是标准输入输出流、文件流、字符串流

5、的基类2. 在同一个类中,可以定义重载的成员函数 void f(int);和 virtual void f(int); 。错,这属于重复定义3. 抽象类不会产生实例,所以不需要有构造函数。错,被派生时需要它的构造函数4. 类 A 有一个非静态的成员函数 f,其函数原型是:void A:f( ) const,则该函数被调用时,一定是通过类 A 或类 A 的某后裔类的一个用 const 修饰符说明的常量对象调用的。错,常函数可以由变量对象或常量对象调用5. 异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。错,可以在外层捕获,并且这是最常见的用法6. 只要程序中没有 A a1 = a

6、2; 和 A a1(a2); 形式的代码,类 A 的拷贝构造函数就不会被调用。错,参数传递或函数返回时也调用拷贝构造函数7. 在 protected 继承方式下,派生类对象的指针不能直接转换成指向基类对象的指针。对,否则基类中的公有成员由不可见变为可见,权限被放大8. 若静态成员函数中调用了一个函数 f,那么 f 一定不是虚函数。对,静态成员函数不能是虚函数,因为虚函数入口需要在保存在对象中的虚函数表中,而静态成员函数不属于对象。9. 若要实例化一个含有引用型数据成员的类,那么只能使用构造函数初始化列表来初始化该数据成员。对,没有别的办法10. 构造函数的函数体中,不能使用 return 语句

7、;但在实现该类的自动类型转化函数时,必须有 return 语句。对三、回答下列各题(每题 4 分,共 20 分)1. 举例说明 static 关键字的用法和相应目的( 至少 3 种)。f() static int a; 函数体内的静态变量,每次调用该函数时值保持不变static int a; 全局的静态变量,约束作用域为所在文件class A static int a; A 的静态成员,类似全局变量,需用 A:a 访问2. 举例说明类的数据成员在哪些情况下必须在初始化列表中进行初始化(至少 3 种) 。基类不提供无参的构造函数成员对象不提供无参的构造函数有常量成员或引用成员- 3 -3. 举例

8、说明虚拟继承的作用和目的。虚拟继承的目的是使基类在派生类中只保留一个副本从而避免二义性4. 举例说明成员函数 A和成员函数 A 的区别。A class A A(int); /转换构造函数friend const A operator+(const A,const A); /重载 +;四、指出下列程序代码中存在的错误或不足,说明原因。 (每题 5 分,共 10 分)1#includeclass A public:virtual A( ) virtual void f( ) coutf( );p-g( );p-k( );delete p;答:函数 k 在 A 中没有定义 ,执行 p-k( );时要

9、根据 p 的类型在 A 中查 k 的信息2#include#includeclass A;class B:public A public:B(const char* info)m_buf=new char256;strcpy(m_buf,info); B( ) delete m_buf; virtual void output( ) cout output( );delete pa; 答:A 的析构函数应定义为虚函数,否则 B 的析构函数不会被调用,m_buf 也不会被释放- 4 -五、写出下面程序的运行结果(每题 5 分,共 10 分)1#include class A public:A(

10、):count(1) virtual A( ) virtual A* Copy( ) const = 0;virtual void Out( ) const = 0;protected:int count;class B:public A public:B( ) -count; Out( ); virtual A* Copy( ) const B *p = new B(*this);+p-count;return p;virtual void Out( ) const cout Out( );a1 = a1-Copy( );a1-Out( );delete a1;答:1210 -2class

11、B:public A public:B(A private:A obj;#include class A public:A(int n):num(n) Out( ); A(const Avoid Out( ) coutclass A public:A(int n):value(n) void Display( ) constcout“Value = “valueendl; private:int value; class B public:B(int n);void Display( ) const aA.Display(); private:A aA;int main( )B b1(1);b

12、1.Display( );B b2(2);b2. Display( );return 0; 1. 3 分 实现类 B 的构造函数,使得程序的输出为:Value=1Value=2答:B(int n):aA(n)23 分 若 main 函数中增加了语句 B b3(b1); 针对本例,说明是否有必要以公有方式自定义并实现类 B 的拷贝构造函数,为什么?答:不需要,因为类 B 及基类 A 中不存在引用或指针成员,使用默认的拷贝构造函数就可以。3. 4 分 在不改动类 A 和 main 函数的前提下,以继承的方式重新定义并实现类 B,使得程序的输出结果不变。答:class B:public A publ

13、ic:B(int n):A(n);void Display( ) const A:Display(); ;七、(共 20 分,每问题 10 分 ) 某程序员为了灵活地对各种的给定的曲线函数 f(x)画出其曲线图形,设计并部分实现了一个曲线类 curve,该类的成员数据中, count 代表坐标点的个数,pxs 代表的数组存放这些坐标点的横坐标,pys 代表的数组存放利用 f(x)计算得到的这些坐标点的纵坐标。由于不同曲线的计算公式 f(x)是不同的,该程序员希望曲线函数的种类可以通过继承 curve 类的方式任意增加,增加一个新的 f(x)时不改变 curve 类中的内容,也不改变利用curv

14、e 类进行图形绘制的算法。已部分完成的 curve 类定义和实现如下:class curve public:void setPxs( ) /*把获取的横坐标数据存放在 pxs 代表的数组中,并为 count 置值*/ double* getPxs( ) const return pxs;- 6 -int getCount( ) const return count;double* getPys( ) const ;private:double* pxs;double* pys;int count;1、请按照该程序员的设计意图给出成员函数 getPys 的完整实现。实现过程中,可以为 curve

15、类增加其它成员。可以假设 setPxs 函数已经完整实现,不需要考虑曲线的绘制和显示。答:class curve public:void setPxs( ) /*把获取的横坐标数据存放在 pxs 代表的数组中,并为 count 置值*/ double* getPxs( ) const return pxs;int getCount( ) const return count;double* getPys( ) const ;virtual double f(double)=0;private:double* pxs;double* pys;int count;double* curve:get

16、Pys( ) const if(pys=NULL) pys=new doublecount;for(int i=0;icount;i+)pysi=f(pxsi);return pys;注:严格来讲,还应在析构函数中释放 pxs 和 pys,但这部分不作为要考的语法点,故此处略掉2、以曲线函数:f(x)=3*x*x+2*x+1.为例,从 curve 派生一个类 curve1,并用文字说明其它的函数(如:main 函数)如何利用基类 curve 中的 getPys 函数获取该曲线的纵坐标值。答:class curve1 : public curvevirtual double f(double x) return3*x*x+2*x+1; ;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报