面向对象程序设计练习题2

  一、单项选择题(本大题共10小题,共20分)
在每小题列出的四个选项中,只有一个是符合题目要求的,请将其代码填在题后的括号内。错选或未选均无分。
单项选择题(本大题共20小题,每小题1分,共20分)
1.面向对象程序设计中的数据隐藏指的是 
  A.输入数据必须输入保密口令
  B.数据经过加密处理
  C. 对象内部数据结构上建有防火墙
  D.对象内部数据结构的不可访问性
2.下列各项中不符合函数重载必须满足的条件的是     A. 必须有不同的参数个数
  B.对应的参数类型必须不相同
  C. A和B必须同时满足
  D.A和B只要满足一个即可
3.下列带缺省值参数的函数说明中,正确的说明是   
A.int Fun(int x,int y=2,int z=3);
  B.int Fun(int x=1,int y,int z=3);
  C. int Fun(int x,int y=2,int z);
  D.int Fun(int x=1,int y,int z=3);
4.有如下的对类“CSample”的说明,其中      是错误的。
    class CSample {   
  A.int a=23;
  B.CSample();
    public:
  C.CSample(int val);
  D.~ CSample();
    }
5.已知类A中的一个成员函数的说明如下:
    void Set(A &a);
  则该函数的参数“A &a”的含义是   
  A.指向A的指针为a
  B.将变量a的地址赋给类A
  C.类A对象引用a用作函数的形参
  D.变量A与a按位与后作函数参数
 6.若类A和类B的定义如下:
  class A {
    public:
    int i,j;
    void get();
  };
  class B:A {
     int i,j;
    protected:
      int k;
    public:
    void make();
  };
  void B::make() { k=i*j; }
  则其中    是非法的表达式。       A.void get();
  B.int k;
  C.void make();
  D.k=i*j;
 7.下面的主程序中,语句    是错误的。
 class A {
    int i;
    public:
    virtual void fun()=0;
    A(int a) { i=a; }
    };
class B {
    int j;
    public:
    void fun() { cout<<”B::fun()\n”; }
    B(int b,int c) :A(b) { j=c; }
    };
    void main() 
  A.{ A a(5);
  B.A *pa;
  C.B b(7);
  D.B *pb;
    }
8.拷贝(复制)构造函数的作用是 
  A.进行数据类型的转换
  B.用对象调用成员函数
  C.用对象初始化对象
  D.用一般类型的数据初始化对象
9.下列说法中,正确的说法是   
  A.所有的运算符都能被重载
  B.运算符被重载时,它们的优先级与结合性不会改变
  C.当需要时,我们可以自定义一个运算符来进行重载
  D.每个运算符都可以被重载成成员函数和友元函数
10.下面对结构或类中成员的访问中,不正确的访问是   
  A.*pointer.salary; (其中pointer为指向类对象的指针)
  B.pointer->salary;
  C.x=worker.salary; (其中worker为具有类类型的对象)
  D.Location &rA=A1;int x=rA.GetX(); (Location为已定义的类,A为对象)
二,填空题(本大题共10小题,共20分)
不写解答过程,将正确的答案写在每小题的空格内。错填或不填均无分。
11.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由____________机制支持,而后者则由____________机制支持。
12.由char const *str=”stucture”;所以定义的指针称为____________,关键字const 所修饰的是____________。
13.引入虚基类的目的是为了解决多重继承中的____________和____________问题。
14.派生类中所定义的虚函数的____________不影响对它的动态联编,即基类中已定义的虚函数,其同名函数放在派生类中的__________,都可以实现运行时多态性。
15.构造函数与析构函数所调用的虚函数是____________的函数,因此调用时实现的是____________联编。
16.C++的____________规则能保证编译器调用正确的成员函数。有时为更保险地保证编译器调用正确的成员函数,可以使用____________操作符。
指向类成员函数的指针
17.说明一个const成员函数(又称常量成员函数)的方法是,将const写在__________之间,而且它修饰的是__________。
18.除析构函数外,不能带有参数的函数还有____________,而且它的返回数据类型不能随便指定,而由____________来决定。
19.当使用new动态生成一个对象时,隐含着对____________的一次调用;而当使用delete删除一个对象时,隐含着对____________的一次调用。
20.对某个运算符的重载,实际上是用关键字____________与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是____________的。
三,改错题(本大题共5小题,每小题2分,共10分)
  21.分析下列程序中的错误,并说明出错原因。
    # include
    class base {
    const int n;
    public:
    base() { cout<<”Initializing default\n”; }
    base(int m) { cout<<”Initializing\n”; n=m; }
    ~base() { cout<<”Destroying\n”; }
    };
    void main()
    { base x=1;
    base y=x;
    }
  22.分析下列程序中的错误,并说明出错原因。
    #include
    class AA {
    public: int aa;
    };
    class BB:virtual public AA {
    int bb;
    };
    class CC:virtual public AA {
    public: int bb;
    };
    class DD:public BB,public CC {
    public: float dd;
    };
    void main()
    { DD p;
    int m=p.aa;
    AA *pr=&p;
    AA &pt=p;
    DD *pp=(DD *)(BB *)pr;
    AA r;
    DD &ps=r;
    }
  23.分析下列程序中的错误,并说明出错原因。
    #include <iostream.h>
    class A {
    int x;
    public:
    A(int a) { x=a; fun(); }
    virtual void fun()=0;
    };
    class B:public A {
    public:
    B(int b) :A(b) {}