一、单项选择题
下面每题的选项中,只有一个是正确的,请选择正确的答案填入答题纸中对应的题号后 (本题共25小题,每小题1分,共25分)。
1、当一个函数无返回值时,函数的类型应定义为(    )。
  A  void      B 任意  C int  D无
2、作用域运算符的功能是(    )。::
A  标识作用域的级别    B  指出作用域的范围
C  给定作用域的大小    D  标识某个成员是属于哪个类
3、下列的(  )是引用调用。
A  形参是指针,实参是地址值    B  形参和实参都是变量
C  形参是数组名,实参是数组名  D  形参是引用,实参是变量
4、(  )不是构造函数的特征
A  构造函数的名和类名相同    B  构造函数可以重载。
C  构造函数可以设置默认值    D  构造函数必须指定类型说明。
5、下列(        )不能作为类的成员。
A  自身类对象的指针  B  自身类对象的引用
C  自身类对象        D  另一个类的对象
6、重载函数在调用时选择的依据,(        )是错误的。
A. 参数个数        B 参数的类型
C  A或者B        D 函数的类型
7、下列静态成员的特性中,(        )是错误的。
A  说明静态成员时,要加修饰符static
B  静态数据成员要在类体外进行初始化
C  引用静态数据成员时,要在静态数据成员名前加<类名>及作用域运算符
D  静态数据成员不是所有对象所共用的
8、已知f1(int)是类A的公有成员函数,p是指向成员函数f1()的指针,采用(  )是正确的。
A  p=f1        B  p=A::f1    C  p=A::f1()  D p=f1()
9、运算符->*的功能是(      )。A a  p=&a  public int i.  int p2=&i
p->*p2  p->*p2  a.i
A  用来表示指向对象指针对指向类成员指针的操作
B  用来表示对象对指向类成员指针的操作
C  用来表示指向对象指针对类成员的操作
D  用来表示对象类成员的操作
10、下列定义中,(  )是定义指向数组的指针p.
A  int p[5]  B int (*p)[5]  C  (int*)p[5]  D int *p[ ]
11、设p为一个指向类A数据成员m的指针,A1为A的一个对象。如果给m赋值5,(  )为正确的。
A  A1.p=5    B  A1->p=5  C A1.*p=5      D  *A1.p=5
12、已知print( ) 函数是一个类的常成员函数,它无返回值。下列表示中,(  )是正确的。
  A  void print ( ) const    B  const void print ( ) 
C  void const print ( )    D  void print (const)
13、说明const char * ptr; 中,ptr应该是(        )。
    A  指向字符常量的指针    B  指向字符的常量指针
C  指向字符串常量的指针  D  指向字符串的常量指针
14、派生类的对象对它的基类成员中(        )是可以访问的。
A 公有继承的公有成员  B  公有继承的私有成员
C  公有继承的保护成员  D  私有继承的公有成员
15、 下列对派生类的描述中,(  )是错的
A  一个派生类可以作为另一个派生类的基类
B  派生类至少有一个基类
C  派生类的成员除了它自己的成员以外,还包含了它的基类成员
D  派生类中继承的基类成员的访问权限到派生类保持不变
16、对于 int * pa[5]; 的描述,(        )是正确的。
A  pa是一个指向数组的指针,所指向的数组是5个int型元素。
B  pa是一个指向某数组中第5个元素的指针,该元素是int型变量。
C  pa[5]表示某个数组的第5个元素的值。
D  pa是一个具有5个元素的指针数组,每个元素是一个int型指针。
17、 设置虚基类的目的是(  )。
A  简化程序  B  消除二义性  C  提高运行效率  D  减少目标代码
18、 带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚函数的子对象初始化(    )。
A  与虚基类下的派生类个数有关  B  多次  C  二次  D 一次
19、 下列函数中,(  )不能重载。
A  成员函数  B  非成员函数  C 析构函数  D  构造函数
20、 关于动态联编的描述中,(        )是错误的。
A  动态联编是以虚函数为基础的
B  动态联编是在运行时,确定所调用的函数代码的。指向类成员函数的指针
C  动态联编调用函数操作是指向对象的指针或对象引用。
动态联编是在编译时确定操作函数的。
21、关于虚函数的描述中,(        )是正确的。
A  虚函数是一个非satatic类的成员函数。
B  虚函数是一个非成员函数。
C 基类中说明了虚函数后,派生类中与其对应的函数可以不必说明为虚函数。
D  派生类的虚函数与基类的虚函数具有不同的参数个数和类型。
22、关于纯虚函数和抽象类的描述中,(        )是错误的。
A  纯虚函数是一种特殊的虚函数,它没有具体的实现。
B  抽象类是指含有纯虚函数的类。
C  一个基类中说明了纯虚函数,则其派生类不再是抽象类。
D  抽象类一般只能作为基类来使用。
23、下列关于抽象类的使用中,(        )是错误的。
A  可以定义抽象类的对象      B  可以定义抽象类的指针
C  可以定义抽象类的引用      D  可以定义抽象类的派生类
24、派生类的构造函数的成员初始化列表中,不能包含(    )。
A  基类的构造函数
B  派生类中子对象的初始化
C  基类的子对象的初始化
D  派生类中一般数据成员的初始化
25、关于new运算符的下列描述中,(  )是错的。
A  它可以用来动态创建对象和对象数组;
B  使用它创建的对象或对象数组可以使用delete运算符删除;
C  使用它创建对象时要调用构造函数;
D  使用它创建对象数组时,必须指定初始值。
二、填空题
将正确的答案填入答题纸相应的题号后。(本题共 3小题,5个空,每空2分,共10分)
1.  面向对象的程序设计有三大特征,它们是封装、 (1 )继承 、 (2 )多态
2、类是用户定义的类型,具有类类型的变量称作 (3)对象
3、在面向对象的程序设计中,通过 (4)封装实现数据隐藏;通过(5)继承实现代码的复用。
三、分析程序的执行结果题
分析程序的执行结果,将结果按程序运行时输出形式填在答题纸对应的题号后 (本题共5小题,每题4分,共20分)。
1、 #include <iostream.h>
class M { public:
          M() { x=y=0; }
          M(int i, int j)
          { x=i; y=j; }
          void copy(M *m);
          void setxy(int i, int j)
          { x=i; y=j; }
          void print() { cout<<x<<","<<y<<endl; }
          private:
              int x, y;};
void M::copy(M *m)
    {  x=m->x; y=m->y;}
void fun(M m1, M *m2)
{ m1.setxy(12, 15);
      m2->setxy(22,25);
}
void main()
{  M p(5, 7), q;
      q.copy(&p);
      fun(p, &q);
  p.print();
  q.print();
}
    2、#include <iostream.h>