2012级C++面向对象程序设计试题A-计算机学院2013夏_参考答案.doc
文本预览下载声明
2012-2013学年第2学期
2012级《C++面向对象程序设计》期末考试试题(A卷)
考试时间:2013年6月26日
参考答案
一、 单选题(共12分,每题2分)
D C (B) B B A
二、 判断正误,对于你认为错误的论述,说明原因或举出反例。(共20分,每题2分)
1. 代码double dval; float *pi = dval; 中会发生隐式类型转换,因此不存在语法错误。错误。Double占8字节,float 占4字节,转换是不安全的,不会发生隐式转换,而是语法错误。
2. 已知类A,且语句const A a; a.fun( );是合法的,则fun( )一定是常成员函数。错误。如fun()是A中的静态成员函数。
3. 类B继承类A,那么sizeof(B)的值大于sizeof(A)的值。错误。是大于或等于
4. 单参构造函数一定可以被用来执行隐式类型转换。错误。不一定。如用explicit修饰的构造函数,或私有的,或只声明但没有实现的。
5. 类中没有声明虚函数,则不会为该类生成虚拟表。错误。不一定。如基类中有虚函数,则在创建该类对象时,仍会生成虚拟表。
6. 异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。错误。可以。如 try { f( ); } catch(…) {}, 如果f()中没有try_catch结构,f( )产生的异常可以被catch(…)捕获。
7. 由于抽象类不能实例化,但能派生新类,所以抽象类中的构造函数和拷贝构造函数应该是protected的。错误。抽象类表示一种泛化关系,其接口函数应在子类中存在,以保证接口的一致性。特别的,构造函数和拷贝构造函数应为public。
8. 虚函数可以访问虚函数和非虚函数,但非虚函数不能访问虚函数。错误。非虚函数的非静态函数可访问虚函数。
9. 重载的析构函数应与重载的构造函数一一对应。错误。析构函数不能重载。
10. 假设类A及其祖先类中均不含有指针型或引用型数据成员,执行代码块{ A a; A b(a); }时,即便使用类A的缺省拷贝构造函数也可能造成内存泄露。正确。
三、 回答下列各题(每题4分,共28分)
1. 某个C++应用程序由1个.h文件和2个.cpp文件组成,各文件如下:
//fun.h
class A {
public:
void fun(int = 0);
};
// fun.cpp
void A::fun(int num = 0)
{ /* 略 */ }
//main.cpp
int main( )
{ A obj;
obj.fun( );
return 0;
}
请指出程序代码中存在哪些问题或有待改进的地方?如何改进?
a) 最好在fun.h中加入包含警戒
b) fun.cpp中应#include”fun.h”
c) main.cpp中应#include”fun.h”
d) fun函数的参数,在类定义和外联实现中均给出了缺省值。
2. 已知字符串类string,请说明函数void fun(string); void fun(string ); 和void fun(const string); 之间在语义和使用上的区别。
void fun(string); 以传值的方式传递一个字符串参数,参数匹配过程中,会调用string类的拷贝构造函数,构造一个新的字符串供fun函数存取。使用时,实参可以是任意一个string对象。实参可以是char*.
void fun(string );以传引用的方式传递一个字符串参数,参数匹配过程中,不用调用string类的拷贝构造函数,而是直接传递一个引用,在fun中对参数的任何修改,影响原始的实参。使用时,要求实参必须是变量型。
void fun(const string);以传引用的方式传递一个字符串参数,参数匹配过程中,不用调用string类的拷贝构造函数,而是直接传递一个引用。同时不允许在fun中对参数进行任何修改操作。使用时,实参可以是变量,也可以使const型。实参可以是char*.
3. 可以对局部对象显式调用析构函数吗?请说明理由。
不可以。若可以,就会产生诸如构造了一个对象,却调用了多次析构函数的情形。所以禁止显式调用析构函数。
4. 请问如何修改类A的设计,使得既可以在类外得到类A的多个实例,又能够禁止从类A派生其它类?
class A {
public: A(int n):val(n) { }
private: int val;
};
class A { public: static A * CreateA(int n) { return new A(n); }
显示全部