面向对象程序设计复习题.docx
面向对象程序设计复习题 1面向对象程序设计复习题 一、单项选择题 1. ( )是面向对象系统包含的要素。 A、类 B、多态 C、友元 D、重载 答案:A 2. 下列对常量的定义中,错误的是()。 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 常成员函数类型成员函数名Const 4 指向对象的常指针类名* 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; 答案:D 4. 下列对构造函数和析构函数的描述中,错误的是()。 A、构造函数可以重载 B、析构函数名与类名相同 C、构造函数中可以设置参数的缺省值 D、类中只有一个析构函数 答案:B 5. 下列对友元的描述中,错误的是()。 A、友元破坏了类的封装性 B、友元提高了程序的运行效率 C、友元可以在类外声明和定义 D、友元能够访问类中的私有成员 答案:C 6. 下列对继承的描述中,正确的是()。 A、派生类对象能够访问基类的公有成员 B、派生类继承了基类的公有成员和保护成员 C、派生类对象不能访问基类的保护成员 D、派生类不改变基类成员的访问权限 答案:C 7. 程序中,编译时出错的语句是()。 class Base ; class Derived : public Base ; Derived objD1; Base objB=objD1; /A Base *pb=&objD1; /B Base &refB=objD1; /C Derived objD2=objB; /D 答案:B 8. 下面对派生类的描述中,正确的是()。 A、派生类是对基类的具体化 B、一个派生类可以作为另一个派生类的基类 C、派生类只能有一个直接基类 D、派生类的缺省继承方式是public 答案:B 9. 实现动态联遍必须通过()调用虚函数。 A、对象引用 B、成员名限定 C、对象名 D、构造函数 答案:A 10. C+流中重载的运算符>>,是一个( )。 A、用于输出操作的非成员函数 B、用于输入操 作的非成员函数 C、用于输出操作的成员函数 D、用于输入操作 的成员函数 答案:B 11. ( )不是面向对象系统包含的要素。 A、多态 B、对象 C、类 D、继 承 答案:A 12. 下列对常量的定义中,错误的是()。 A、int const size=10; B、char * const p="Good Luck" C、void const print(); D、const MyClass obj(10,10); 答案:C 13. 设Address表示整型变量x的地址,则下列语句执行后的输出结果为()。 int x=100,&r=x; cout<<x<<'-'<<r<<endl; A、Address-100 B、100-Address C、Address-Address D、100-100 答案:D 14. 若函数原型为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') 答案:B 15. 若有如下函数声明: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; 答案:C 16. 下列对构造函数和析构函数的描述中,正确的是()。 A、析构函数不可以重载 B、构造函数不能定义为内联函数 C、构造函数中不能设置参数的缺省值 D、析构函数名与类名不同 答案:A 17. 下面对静态成员的描述中,错误的是()。 A、静态成员的提出是为了解决数据共享问题 B、静态数据成员的初始化在类体外进行 C、类的不同对象有不同的静态数据成员值 D、静态成员函数可以直接访问类中的静态数据成员 答案:C 18. 下列对友元的描述中,正确的是()。 A、友元可以在类外声明和定义 B、友元降低了程序的运行效率 C、友元不能访问类中的保护成员 D、友元破坏了类的封装性 答案:D 19. 下列对继承的描述中,错误的是()。 A、派生类对象不能访问基类的保护成员 B、派生类对基类成员的访问权限随着继承方式而改变 C、派生类成员可以访问基类的私有成员 D、派生类继承了基类的所有成员 答案:C 20. 程序中,编译时出错的语句是()。 class Base ; class Derived : public Base ; Derived objD1; Base objB=objD1; /A Base *pb=&objD1; /B Base &refB=objD1; /C Derived objD2=objB; /D 答案:D 21. 下面对派生类的描述中,错误的是()。 A、派生类是对基类的具体化 B、派生类能够作为基类继续派生新类 C、派生类可以有多个直接基类 D、派生类的缺省继承方式是private 答案:A 22. 实现动态联遍不能通过()调用虚函数。 A、构造函数 B、对象引用 C、对象指针 D、成员函数 答案:A 23. 下面()不是抽象类的特性。 A、可以说明纯虚函数 B、不能说明抽象类的对象 C、用做基类,提供公共的接口 D、可以定义虚构造函数 答案:D 24. C+流中重载的运算符<<,是一个( )。 A、用于输出操作的成员函数 B、用于输出操作的 非成员函数 C、用于输入操作的成员函数 D、用于输入操作的 非成员函数 答案:B 25:下列有关类的说法不正确的是()。 A对象是类的一个实例 B任何一个对象只能属于一个具体的类 C一个类只能有一个对象 D类与对象的关系和数据类型与变量的关系相似 答案:C 分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。 26:下面()项是对构造函数和析构函数的正确定义。 Avoid X:X(), void X:X() BX:X(参数), X:X() CX:X(参数), X:X(参数) Dvoid X:X(参数), void X:X(参数) 答案:B 分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。 27:()的功能是对象进行初始化。 A析构函数 B. 数据成员 C.构造函数 D.静态成员函数 答案:C 分析:当一个对象定义时,C+编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C+编译系统自动调用析构函数注销该对象并进行善后工作; 28:下列表达方式正确的是()。 Aclass P Bclass P public:public: int x=15;int x; void show()cout<<x; void show()cout<<x; ; Cclass 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 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=b 3. 下列程序执行后的输出结果是B0 D00 B1 D23 D B D B,请将下列程序补充完整。 class Base public: Base(int i=0) x = i; cout<<'B'<<x<<' ' Base() cout<<"B"<<x<<' ' private: int x; ; class Derived : public Base int y, z; public: _(1)_ _/ Constructor _(2)_ _/ Destructor ; void main() Derived obj1; Derived obj2(1,2,3); 3. 答案:(1) Derived(int a=0,int b=0,int c=0): Base(a) y=b; z=c; cout<<'D'<<y<<z<<' ' (2) Derived() cout<<"D " 4:设有如下程序结构: class Box ; void main() Box A,B,C; 该程序运行时调用(1) 次构造函数;调用(2) 次析构函数。 答案:(1)3 (2)3 分析:每创建一个对象自动调用一次构造函数,在这里创建了A、B、C三个对象,所以共调用了三次构造函数;每释放一个对象,系统自动调用一次析构函数,A、B、C对象释放时,分别调用析构函数,所以析构函数共调用了三次。 5:设A为test类的对象且赋有初值,则语句test B(A); 表 示。 答案:将对象A复制给对象B。 分析:执行test B(A);语句相当于调用了默认复制构造函数,将A对象的属性复制给B对象。 6:利用“对象名.成员变量”形式访问的对象成员仅限于被声明为(1) 的成员;若要访问其他成员变量,需要通过(2) 函数或(3) 函数。 答案:(1) public (2) 成员函数(3)友元函数 分析:类体内的数据成员可声明为公有的、私有的和保护的,公有的数据成员可利用“对象名.成员变量”形式来进行访问;私有的数据成员能被类中的其他成员函数或友元函数所调用;保护的数据成员可以在类体中使用,也可以在派生类中使用,但不能在其他类外通过对象使用。 三、阅读程序题 1. #include class T est public: T est (double m,double n,double d):p(d) x=m; y=n; void Show(); void Show() const; private: double x, y;