1《面向对象程序设计》复习题一、单项选择题1. ()是面向对象系统包含的要素。
A、类B、多态C、友元D、重载答案:A2. 下列对常量的定义中,错误的是()。
A、MyClass const obj(3,4);B、char * const p="hello";C、int i=1; const int &ref=i;D、void show() const;答案:C常量的定义:1常对象Const 类名对象名【(实参列表)】类名Const 对象名【(实参列表)】2 常数据成员Const 类型常数据成员3 常成员函数类型成员函数名Const4 指向对象的常指针类名* Const 指针变量名=对象地址5 指向常变量的指针变量Const 类型名* 指针变量名3. 若有如下函数声明:void Fun(int x);,则下列()能与该函数进行重载。
A、void Fun(int y);B、void Fun(int x,int y='1');C、int Fun(int x);D、void Fun(int) const;答案:D4. 下列对构造函数和析构函数的描述中,错误的是()。
A、构造函数可以重载B、析构函数名与类名相同C、构造函数中可以设置参数的缺省值D、类中只有一个析构函数答案:B5. 下列对友元的描述中,错误的是()。
A、友元破坏了类的封装性B、友元提高了程序的运行效率C、友元可以在类外声明和定义D、友元能够访问类中的私有成员答案:C6. 下列对继承的描述中,正确的是()。
A、派生类对象能够访问基类的公有成员B、派生类继承了基类的公有成员和保护成员C、派生类对象不能访问基类的保护成员D、派生类不改变基类成员的访问权限答案:C7. 程序中,编译时出错的语句是()。
class Base{ };class Derived : public Base { };Derived objD1;Base objB=objD1; //ABase *pb=&objD1; //BBase &refB=objD1; //CDerived objD2=objB; //D答案:B8. 下面对派生类的描述中,正确的是()。
A、派生类是对基类的具体化B、一个派生类可以作为另一个派生类的基类C、派生类只能有一个直接基类D、派生类的缺省继承方式是public答案:B9. 实现动态联遍必须通过()调用虚函数。
A、对象引用B、成员名限定C、对象名D、构造函数答案:A10. C++流中重载的运算符>>,是一个()。
A、用于输出操作的非成员函数B、用于输入操作的非成员函数C、用于输出操作的成员函数D、用于输入操作的成员函数答案:B11. ()不是面向对象系统包含的要素。
A、多态B、对象C、类D、继承答案:A12. 下列对常量的定义中,错误的是()。
A、int const size=10;B、char * const p="Good Luck";C、void const print();D、const MyClass obj(10,10);答案:C13. 设Address表示整型变量x的地址,则下列语句执行后的输出结果为()。
int x=100,&r=x;cout<<x<<'-'<<r<<endl;A、Address-100B、100-AddressC、Address-AddressD、100-100答案:D14. 若函数原型为void Fun(int x=9,int y=8,char z='7'),则下列调用错误的是()。
A、Fun()B、Fun(3, '0')C、Fun(1,2)D、Fun(2,4, 'a')答案:B15. 若有如下函数声明:void Fun(int x);,则下列()不能与该函数进行重载。
A、void Fun(int x,int y);B、void Fun(double x);C、void Fun(int x,int y=1);D、void Fun(int x) const;答案:C16. 下列对构造函数和析构函数的描述中,正确的是()。
A、析构函数不可以重载B、构造函数不能定义为内联函数C、构造函数中不能设置参数的缺省值D、析构函数名与类名不同答案:A17. 下面对静态成员的描述中,错误的是()。
A、静态成员的提出是为了解决数据共享问题B、静态数据成员的初始化在类体外进行C、类的不同对象有不同的静态数据成员值D、静态成员函数可以直接访问类中的静态数据成员答案:C18. 下列对友元的描述中,正确的是()。
A、友元可以在类外声明和定义B、友元降低了程序的运行效率C、友元不能访问类中的保护成员D、友元破坏了类的封装性答案:D19. 下列对继承的描述中,错误的是()。
A、派生类对象不能访问基类的保护成员B、派生类对基类成员的访问权限随着继承方式而改变C、派生类成员可以访问基类的私有成员D、派生类继承了基类的所有成员答案:C20. 程序中,编译时出错的语句是()。
class Base{ };class Derived : public Base { };Derived objD1;Base objB=objD1; //ABase *pb=&objD1; //BBase &refB=objD1; //CDerived objD2=objB; //D答案:D21. 下面对派生类的描述中,错误的是()。
A、派生类是对基类的具体化B、派生类能够作为基类继续派生新类C、派生类可以有多个直接基类D、派生类的缺省继承方式是private答案:A22. 实现动态联遍不能通过()调用虚函数。
A、构造函数B、对象引用C、对象指针D、成员函数答案:A23. 下面()不是抽象类的特性。
A、可以说明纯虚函数B、不能说明抽象类的对象C、用做基类,提供公共的接口D、可以定义虚构造函数答案:D24. C++流中重载的运算符<<,是一个()。
A、用于输出操作的成员函数B、用于输出操作的非成员函数C、用于输入操作的成员函数D、用于输入操作的非成员函数答案:B25:下列有关类的说法不正确的是()。
A.对象是类的一个实例B.任何一个对象只能属于一个具体的类C.一个类只能有一个对象D.类与对象的关系和数据类型与变量的关系相似答案:C分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。
26:下面()项是对构造函数和析构函数的正确定义。
A.void X::X(), void X::~X()B.X::X(参数), X::~X()C.X::X(参数), X::~X(参数)D.void X::X(参数), void X::~X(参数)答案:B分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。
27:()的功能是对象进行初始化。
A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数答案:C分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作;28:下列表达方式正确的是()。
A.class P{ B.class P{ public:public:int x=15;int x;void show(){cout<<x;} void show(){cout<<x;} };} C.class P{ D. class P{int f; public:};int a;f=25;void Seta (int x) {a=x;}; 答案:D分析:在类体内不可对数据成员进行初始化;类定义结束时需用分号;只有类中的成员函数才能存取类中的私有数据。
29:拷贝构造函数具有的下列特点中,()是错误的。
A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的B.拷贝构造函数只有一个参数,并且是该类对象的引用C.拷贝构造函数是一种成员函数D.拷贝构造函数的名字不能用类名答案:D分析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。
30:关于静态成员的描述中,()是错误的。
A.静态成员可分为静态数据成员和静态成员函数B.静态数据成员定义后必须在类体内进行初始化C.静态数据成员初始化不使用其构造函数D.静态数据成员函数中不能直接引用非静态成员答案:B分析:静态成员可分为静态数据成员和静态成员函数;静态数据成员被定义后,必须对它进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等;静态数据成员初始化与该类的构造函数和析构函数无关;在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。
31:关于友元的描述中,()是错误的。
A.友元函数是成员函数,它被说明在类体内B.友元函数可直接访问类中的私有成员C.友元函数破坏封装性,使用时尽量少用D.友元类中的所有成员函数都是友元函数答案:A分析:友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用。
二、填空题1. 下列运算符既可以作为类的成员函数重载,也可以作为类的1. 答案: (1) a.operator+(b) (2) operator+(a,b)(3) a.operator++(0) (4) operator –(0)2. 下列程序执行后的输出结果是12,21,22,请将下列程序补充完整。
#include <iostream.h>void fun1((1), int b) { int c; c=a; a=b;b=c; }void fun2((2), int *b) { int c; c=*a; (3);*b=c; }void fun3((4), int b) { int c; c=a; (5);b=c; }void main(){int x,y;x=1; y=2; fun1(x,y); cout<<x<<y<<',';x=1; y=2; fun2(&x,&y); cout<<x<<y<<',';x=1; y=2; fun3(x,y); cout<<x<<y<<endl;}2. 答案: (1) int a (2) int *a (3) *a=*b(4) int &a (5) a=b3. 下列程序执行后的输出结果是B0 D00 B1 D23 ~D ~B ~D~B,请将下列程序补充完整。