面向对象程序设计100分钟
√
一.单选题(每题1分,共35分)
1、下面关于类概念的描述中,(D)是错误的。
A、类是抽象数据类型的实现
B、类是具有共同行为的若干对象的统一描述体
C、类是创建对象的样板
D、类就是c语言中的结构类型
2、一个函数无返回值,则定义它是函数的类型应是(A)
A、void
B、任意
C、int
D、无
3、下列的(D)是引用调用
A、形参是指针,实参是地址值
B、形参和实参都是变量
C、形参是数组名,实参是数组名
D、形参是引用,实参是变量
4、C++中,关于下列设置参数默认值的描述中,(C)是正确的。
A、不允许设置参数的默认值
B、设置参数默认值只能在定义函数时设置
C、设置参数默认值时,应先设置右边的再设置左边的
D、设置参数默认值时,应该全部参数都设置
5、重载函数调用时选择的依据中,没有( D )
A、参数个数
B、参数类型
C、函数名字
D、函数的类型
6、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执
行速度,选用( A )合适。
A、内联函数
B、重载函数
C、递归调用
D、嵌套调用
7、采用函数重载的目的在于( D )
A、代码共享
B、减少空间
C、提高速度
D、使用方便,提高可读性
8、在下列关键字中,用以说明类中公有成员的是( A )
A、public
B、private
C、protected
D、friend
9、下列的各类函数中,( C )不是类的成员函数。
A、构造函数
B、析构函数
C、友元函数
D、拷贝构造函数
10、下面关于构造函数的说法错误的是(D )
A、构造函数的函数名与类名相同
B、构造函数可以重载
C、构造函数可以设置缺省参数
D、构造函数必须指定类型说明
11、通常的拷贝构造函数的参数是( C )
A、某个对象名
B、某个对象的成员名
C、某个对象的引用名
D、某个对象的指针名
12、关于成员函数特征的下列描述中,错误的是(A )。
A、成员函数一定是内联函数
B、成员函数可以重载
C、成员函数可以设置缺省参数
D、成员函数可以是静态的
13、下述静态数据成员的描述中,错误的是(C )。
A、说明静态数据成员是前边要加修饰符static
B、静态数据成员要在类体外初始化
C、引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符
D、静态数据成员不是所有对象共有的
14、已知:print()函数是一个类的只读成员函数,它无返回值,下列表示中,正确的是
( A )。
A、void print( )const ;
B、const void print( );
C、void const print( );
D、void print(const);
15、关于new运算符的下列描述中,错的是(D )。
a)它可以用来动态创建对象和对象数组
b)使用它创建的对象和对象数组应使用运算符delete删除
c)使用它创建对象时要调用构造函数
d)使用它创建对象数组时必须指定初始值
16、有转型功能的构造函数,应该是( B )
A、带参数的构造函数
B、带有一个参数的构造函数
C、带有两个以上参数的构造函数
D、缺省构造函数
17、下列对派生类的描述中,错误的是(D )。
A、一个派生类可以做另一个派生类的基类
B、派生类至少有一个基类
C、派生类的成员除了它自己的成员外,还包含了它基类的成员
D、派生类中从基类继承的成员,其访问权限不变。
18、派生类对象对基类成员中的( A )是可以访问的。
A、公有继承的公有成员
B、公有继承的私有成员
C、继承的保护成员
D、私有继承的公有成员
19、关于多继承二义性的描述中,错误的是(C )。
A、一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员进行访问可能
出现二义性
B、解决二义性最常用的方法是用“类名::”指定成员名所属类
C、基类和派生类中出现的同名成员函数也存在二义性问题
D、一个派生类是从两个基类派生而来的,而这两个基类有一个共同的基类,对该基类
成员进行访问时,也可能出现二义性。
20、设置虚基类的目的( B )
A、简化程序
B、消除二义性
C、提高运行效率
D、减少目标代码
21、派生类对基类继承的传递性中,( C )是错误的。
A、在公有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数去访问
基类的私有数据成员
B、在公有继承方式下,间接派生类对象可以直接调用基类中的公有成员函
数去访问基类的私有数据成员
C、在私有继承方式下,直接派生类对象可以直接调用基类中的公有成员函
数去访问基类的私有数据成员
D、不管是私有继承还是公有继承,基类的私有成员在派生类的作用域内都
是不可见的
22、下列函数中,不能重载的是( C )。
A、成员函数
B、非成员函数
C、析构函数
D、构造函数
23、下列运算符中,( C )不能重载。
A、+
B、[ ]
C、::
D、new
24、下列关于运算符重载的描述中,正确的是(D )。
A、运算符重载可以改变运算量的个数
B、运算符重载可以改变优先级
C、运算符重载可以改变结合规则
D、运算符重载可以不可以改变语法结构
25、下列关于动态联编的描述中,错误的是( D )
A、动态联编是以虚函数为基础的
B、动态联编在程序运行时确定所调用的函数代码块
C、动态联编调用多态函数时传递给它的基类对象的指针或基类对象的引用
D、动态联编是在编译时确定调用某个函数
26、下列关于虚函数的描述中,正确的是( C )。
A、虚函数是一个static类型的成员函数
B、虚函数是一个非成员函数
C、基类中说明了虚函数后,其派生类中的对应函数可不必重新再说明
D、基类中的虚函数和其派生类中的虚函数具有不同的参数个数和类型
27、虚函数只有在( D )时才能实现多态性
A、基类和派生类具有同名虚函数,而它们的参数个数不同
B、用指向基类指针或基类的对象引用访问虚函数
C、基类和派生类具有同名虚函数,而他们的参数至少有一个类型不同
D、基类和派生类具有函数原型完全相同的同名虚函数,函数体内的执行代
码不同
28、下列关于纯虚函数和抽象类的描述中,错误的是(C )
A、纯虚函数是一种特殊的虚函数,它没有具体的实现部分
B、抽象类是指具有纯虚函数的类
C、一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类
D、抽象类只能作为基类来使用,其纯虚函数的实现部分由派生类给出
29、下列对抽象类的描述中,正确的是( D )
A、可以说明虚函数
B、可以进行构造函数重载
C、可以定义友元函数
D、不能说明其对象
30、进行文件操作时需要包含( B )文件
A、ostream
B、fstream
C、cstdio
D、cstdlib
31、关于getline()函数的下列描述中,()是错误的。
A、该函数是用来从键盘上读取字符串的
B、该函数读取的字符长度是受限制的
32、以下叙述中正确的是:( B )
A、在定义构造函数时可以指定返回类型
B、在定义析构函数时不能指定参数
C、一个类只能有一个构造函数
D、在一个类可以有多个析构函数
33、C++类体系中,不能被派生类继承的有( B )。
A、转换函数、构造函数
B、构造函数、赋值操作函数
C、虚函数、静态成员函数
D、静态成员函数、转换函数
34、以下哪个基类中的成员函数表示纯虚函数( C )
A、virtual void vf(int)
B、void vf(int)=0;
C、virtual void vf( )=0
D、virtual void vf(int){ }
35、类模板的使用实际上是将类模板实例化成一个具体的( A )
A、类
B、对象
C、函数
D、模板类
二、分析输出结果(共15分,每题5分)
1、
#include
using namespace std;
void swap(int & x, int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
void main()
{
int a=5,b=9;
cout<<”a=”< swap(a,b); cout<<”a=”< } a=5b=9 a=9b=5 2、 #include using namespace std; class Counter{ private: static int count; int ch; public: Counter(int c){ count++;ch=c; } Static int RC() { return count; } int RCh() { return ch; } ~Counter() { count--; ch=0; } }; int Counter::count=10; void main() { Counter c1(1),c2(2); cout<<”V alue of Counter is currently”< cout<<”Object c2 NO:”< } V alue of Counter is currently12 Object c1 NO:1 Object c2 NO:2 3、 #include using namespace std; class Matrix{ double*elem; int row,col; public: Matrix(int r , int c) { row=r;col=c;elem=new double[row*col]; } double & operator( ) (int x,int y) { return elem[col*x+y]; } double operator( )(int x,int y)const { return elem[col*x+y]; ~matrix() { delete[]elem; } }; void main() { Matrix m(5,8); for(int i=0;i<5;i++) m(i,1)=i+5; for(i=0;i<5;i++) cout< cout< } 5,6,7,8,9, 三、指出下列程序中的错误,简洁说明错误原因(每题2分,共20分) 1、 #include using namespace std; class Student{ public: void set( string &s)const{ setaux(s); } private: void setaux(string &s){dm=s;} string dm; }; 函数set为只读函数,因此不能改变成员变量的值。所以不能调用setaux()修改dm的值2、 class car{ private: car(); }; int main() { car k1; return 0; } Car的无参构造函数被设置为私有,因此不能在外部被调用。 3、 class A{ public: A(int a){c=a;} private: const int c; }; C被修饰为const常量,因此不能改变它的值。 private: int x; } 在静态方法中不能访问非静态变量x 5、 class B{ protected: void set_x(int a){x=a;} private: int x; }; int main(){ B a1; a1.set_x(4); } Class Bprotected成员函数或变量对其对象不可见 6、 class AC{ public: AC(int a){x=a;} private: int x; }; class CD:public AC{ public: CD( ){ } }; AC无默认构造函数,因此要在CD类中显式调用AC的有参数的构造函数7、 class B{ public: virtual void m()=0; private: int x; }: B a1; 纯虚函数不能构造实例对象 8、 class A{ public: void f( ){ } }; class C{ public: void m( ){ } A*p; p=dynamic_cast(new C); } dynamic_cast进行类型转换需要以多态为前提 9、 class Point { public: bool operator>(const Point &,const Point &)const; }; bool Point::operator>(const Point&s1,const Point &s2)const{ } 双目运算符>操作符重载函数参数只有一个 10、 template class menu{ }; menu< T > q1; 模板实例化类的时候需要指定类型 四、问答题(每题3分,共15分) 1、若程序员没有为类定义拷贝初始化构造函数,则编译器将自动生成一缺省的拷贝初始化构造函数,在什么情况下需要程序员提供自定义拷贝构造函数,并解释原因?拷贝构造函数的目的是可以将一个对象的属性完全赋给另一个对象。缺省的拷贝构造函数有一个问题,当对象中有指针类型的成员变量时,将达不到理想的效果。拷贝与被拷贝的对象的指针成员将指向同一存储空间。因此要自定义拷贝构造函数来手动进行对指针成员变量的拷贝。 2、分析下面的类体系。 class A{ public: int i; void f(float); }; class B: public A{ public: int i; void f(int); }; 则下面的访问是否具有二义性(b为类B的一个对象)? b.i; b.f(3.5);都不具有二异性。;派生类中的成员变量i覆盖了基类的i,也就是说A类中的i被隐藏了。因为派生类中的成员函数f的函数签名不同于基类A,也就是说B类重载了函数f。 两句代码都访问的是B类中的成员变量及函数。 3、面向对象程序设计的特点是什么?继承、多态、封装、抽象 4、main() { cout<<”This is a string!” } public: Clock(void); Clock(int h,int m,int s); Clock(Clock &c); }; void main() { Clock a(9,30,0); //(1) Clock(int h,int m,int s); Clock b=a;//(2) Clock(Clock &c); Clock c; //(3)} Clock(void); 请回答(1)、(2)、(3)依次调用了哪个构造函数? 五、程序设计(共15分) 定义如下一个类: class Animal{ public :virtual char *identify( ){return “Animal”;} }; 而Tiger类从Animal类派生而来,即 class Tiger:public Animal{ ………..} 又有lion类从Animal类派生而来,即 class Lion:public Animal { ………..} 每个派生类至少有一个成员函数可实现在CRT上显示“自己的类名及从那些基类派生而来”的信息,例如Tiger类应该显示如下信息:(Tiger:Animal)。现有杂交品种lion_tiger(狮虎兽)类,它从Tiger类和Lion类继承而来,其类体内至少有一个成员函数可在CRT上实现显示如下信息的功能: (Lion_Tiger:(Tiger:Animal),(Lion:Animal)). 试编写一个完整的可运行程序完成上述功能,其中还应包括能测试这些功能的main()函数。 4、#include Using namespace std Int main(){ Cout<<””< } 注意: 1.名字空间,如果无特殊需要,用using指令使用std名字空间 2.使用输入输出流需要引用iostream偷文件 3.main函数无返回类型应该定义为void #include using namespace std; class Animal{ public: virtual char *identify(){return "Animal";} }; class Tiger:public Animal{ public: char *identify(){return "(Tiger:Animal)";} }; class Lion:public Animal{ public: char *identify(){return "(Lion:Animal)";} }; class Lion_Tiger:public Tiger,public Lion{ public: char *identify(){return "Lion_Tiger:(Tiger:Animal),(Lion:Animal)";} }; void main(){ Animal *p; Tiger t; Lion l; Lion_Tiger lt; p=&t; cout< p=&l; cout< // p=< cout< } 三.指出下列程序中的错误,简洁说明错误原因(每题2分,共20分)1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 四、问答题(每题3分,共15分)1、 2、 3、 4、 5、 五、程序设计(共15分)