c++面向对象程序设计—考试题及习题讲解

第一部分  选择题  (共20分)

一、单项选择题(本大题共10小题,每小题2分,共20分)

 1.在C++中,函数原型不能标识(  D  )

  A.函数的返回类型                 B.函数参数的个数

  C.函数参数类型                   D.函数的功能   p108有叙述

2.在C++程序中,对象之间的相互通信通过(  B  )  ?

  A.继承实现                       B.调用成员函数实现

  C.封装实现                       D.函数重载实现

3.对于任意一个类,析构函数的个数最多为( B   )

  A.0              B.1              C.2              D.3

P288 析构函数不接受参数,也不返回数值。类只可能有一个析构函数,不能进行析构函数的重载。

4.下面函数模板定义中不正确的是(  A  )

  A.template<class Q>              B.template<class Q>

    QF(Q x){                          QF(Q x){

       return Q+x;                      return x+x;

    }                                }

  C.template<class T>              D.template<class T>

    TF(T x){                          TF(T x){

       return x*x;                      return x>1;

    }                                }

5.友元关系不能( c A   )?

  A.继承

  B.是类与类的关系

  C.是一个类的成员函数与另一个类的关系 p316

  D.提高程序的运行效率

6.语句ofstream f(〃SALARY.DAT〃,ios::app|ios::binary);的功能是建立流对象f,试图打开文件SALARY.DAT并与之连接,并且(  A  )

 A.若文件存在,将文件写指针定位于文件;若文件不存在,建立一个新文件

  B.若文件存在,将其置为空文件;若文件不存在,打开失败

  C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件

  D.若文件存在,打开失败;若文件不存在,建立一个新文件

7.下面说法正确的是(  B  )

  A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方

  B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方

  C.类的内联函数必须在类体内定义

  D.类的内联函数必须在类体外通过加关键字inline定义

8.可以用p.a的形式访问派生类对象p的基类成员a,其中a是( D   )

  A.私有继承的公有成员              B.公有继承的私有成员

  C.公有继承的保护成员              D.公有继承的公有成员

9.在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( A   )

  A.派生类的对象可以赋给基类的对象

  B.派生类的对象可以初始化基类的引用

  C.派生类的对象可以直接访问基类中的成员

  D.派生类的对象的地址可以赋给指向基类的指针

10.对于类定义

  class A{

        public:

             virtual void func1(  ){  }

             void func2(  ){  }

  };

  class B:public A{

        public:

             void func1( ){cout<<〃class B func 1〃<<end1;}

             virtual void func2( ){cout<<〃class B func 2〃<<end1;}

  };

  下面正确的叙述是( C   )

  A. A::func2( )和B::func1( )都是虚函数

  B. A::func2( )和B::func1( )都不是虚函数

  C. B::func1( )是虚函数,而A::func2( )不是虚函数

  D. B::func1( )不是虚函数,而A::func2( )是虚函数

第二部分  非选择题  (共80分)

二、填空题(本大题共10小题,每小题2分,共20分)

 11.定义类的动态对象数组时,系统只能够自动调用该类的拷贝构造函数对其进行初始化。

12.无论是什么继承方式,派生类的成员不能访问基类private属性的成员。

13.表达式cout<<end1还可表示为_cout<<” /n ”;__。

14.基类的公有成员在派生类中的访问权限由继承方式决定。

15.C++支持的两种多态性分别是静态多态性和动态多态性。

16.C++中语句const char * const p=〃hello〃;所定义的指针p和它所指的内容都不能被修改

17.假定AB为一个类,则语句AB(AB&x);为该类_构造?_函数的原型说明。

18.说明常成员函数时,字const写在成员函数的函数的参数表和函数体之间

19.在C++中,访问一个对象的成员所用的运算符是指针,访问一个指针所指向的对象的成员所用的运算符是this指针

20.派生类从一个或多个以前定义的该类的基类继承数据和函数。

三、改错题(本大题共5小题,每小题2分,共10分)

21.指出下面程序段中的错误,并说明出错原因。

class A{

      int a,b;

public:

      A(int aa,int bb) {a=aa;b=bb;}

};

A x(2,3),y(4);                                          y(4,0)

22.指出并改正下面利用类模板的对象定义中的错误。

template <class T>

class Tany{

   T x,y;

public:

   Tany(T a,T b){x=a,y=b;}

   T sum( ){return x+y;}

};

Tany (int) obj(10,100);                                   改为Tany<int>

23.指出下面程序段中的错误,并说明出错原因。

class one{

   private:

      int a;

   public:

      void func(two&);                       void func(two &)错误,不能前向申明

};

class two{

   private:

      int b;

      friend void one::func(two&);

};

void one::func(two& r)

{

     a=r.b;

}

24.指出下面程序段中的错误,并说明出错原因。

#include <iostream.h>

class A{

      public:  void fun( ){cout<<〃a.fun〃<<endl;}

};

class B{

      public:  void fun( ){cout<<〃b.fun〃<<endl;}

              void gun( ){cout<<〃b.gun〃<<endl;}

};

class C:public A,public B{

      private:int b;

      public:void gun( ){cout<<〃c.gun〃<<endl;}

             void hun( ){fun( );}                改为void hun( ){A:fun( );}或B:fun( )

};

25.指出下面程序段中的错误,并说明出错原因。

class Location {

           int X,Y=20;       Y=20出错,类定义中不能显式地将类的数据成员初始化

protected:

           int zeroX,zeroY;

           int SetZero(int ZeroX,int ZeroY);

private:

           int length,height;

public:

           float radius;

           void init(int initX,int initY);

           int GetX( );

           int GetY( );

};

四、完成程序题(本大题共5小题,共20分)

    根据题目要求,完成程序填空。

26.在下面横线处填上适当字句,完成类中成员函数的定义。

class A{

      int * a;

     public:

      A(int aa=0) {

             a=_new int(aa)_;//用aa初始化a所指向的动态对象

      }

      ~A(){_delete a_;}//释放动态存储空间

};

27.下面是一个函数模板,用于计算两个向量的和。在下面横线处填上适当字句,完成函数模板定义。

#include <iostream.h>

template<class T>

T* f(T* a,T* b,int n)

{

  T* c=_new T[n]___;

  for(int i=0;i<n;i++)

        c〔i〕=_a[i]+b[i] __;

  return c;

}

void main()

{

  int a〔5〕={1,2,3,4,5},b〔5〕={10,20,30,40},*p;

  p=f(a,b,5);

  for(int i=0;i<5;i++)

        cout<<p〔i〕<<endl;

}

28.下面是一个用户口令检查程序,在横线处填上适当语句完成程序功能。

#include <iostream.h>

#include <string.h>

_char* PASS=”wolleh”;__//定义由PASS指针所指向的口令wolleh。

void main()

{

    char user〔10〕;//用于存放输入的口令

    cout<<〃please input your password:〃<<endl;

    __cin>>user;_//输入口令

    if((strcmp(user,PASS))==0)

       cout<<〃your password is correct〃<<endl;

    else

       cout<<〃your password is error〃<<endl;

}

29.下面是类fraction(分数)的定义,其中重载的运算符<<以分数形式输出结果,例如将三分之二输出为2/3。在横线处填上适当字句。

class fraction{

   int den;   //分子

   int num;   //分母

   friend ostream& operator<<(ostream&,fraction);

   …

};

ostream& operator <<(ostream& os,fraction fr){

   _cout<<den<< ”/ ”<<num<<endl__;

   return ___os______;

}

30.在下面程序横线处填上适当的字句,使其输出结果为0,56,56。

#include <iostream.h>

class base{

   public:

      ____int__func( ){return 0;}

};

class derived:public base{

   public:

       int a,b,c;

       ____void_____ setValue(int x,int y,int z){a=x;b=y;c=z;}

       int func( ){return(a+b)*c;}

};

void main()

{

  base b;

  derived d;

  cout<<b.func( )<<′,′;

  d.setValue(3,5,7);

  cout<<d.func( )<<′,′;

  base& pb=d;

  cout<<pb.func( )<<end1;

}

五、程序分析题(,每小题5分,共30分)

    给出下面各程序的输出结果。

31.#include <iostream.h>

     void main( )

     {

         int *a;

         int *&p=a;

         int b=10;

         p=&b;

         cout<<*a;

     }

     输出为:

32.#include <iostream.h>

     template<class T>

     Tf(T*a,T*b,int n){

        Ts=(T)0;

        for(int i=0;i<n;i++)

          s+=a〔i〕*b〔i〕;

        return s;

     }

     void main()

     {

       double c 〔5〕={1.1,2.2,3.3,4.4,5.5},d〔5〕={10.0,100.0,1000.0};

       cout<<f(c,d,5)<<endl;

     }

     输出为:2531

33.#include <iomanip.h>

     void main()

     {

          for(int i=0;i<4;i++)

             cout<<endl<<setfill(′′)<<setw(4-i)<<′0′

                 <<setfill(′*′)<<setw(i+i)<<(i>0?′0′:′′);

     }

     输出为:

34.运行下面的程序,写出当输入25,60时的输出结果。

   #include <iostream.h>

   class goods{

         private:

               static int totalWeight;

               int weight;

         public:

               goods(int w)

               {

               weigh=w;

               totalWeight+=w;

         }

         goods(goods& gd)

         {

               weight=gd.weight;

               totalWeight+=weight;

         }

         ~goods()

         {

               totalWeight-=weight;

         }

         int getwg()

         {

               return weight;

         }

         static int getTotal()

         {

               return totalWeight;

         }

   };

   int goods::totalWeight=0;

   void main()

   {

         int w;

         cout<<〃The initial weight of goods:〃<<goods::getTotal()<<endl;

         cin>>w;   //输入25

         goods g1(w);

         cin>>w;   //输入60

         goods g2(w);

         cout<<〃The total weight of goods:〃<<goods::getTotal()<<endl;

   }

   输出为:

35.#include <iostream.h>

   class A{

         public:

              A( ){ }

              virtual void func( ){cout<<〃Destructor A〃<<endl;}

              ~A( ) {func();}

   };

   class B:public A{

         public:

             B( ){ }

             void func(){cout<<〃Destructor B〃<<endl;}

             ~B( ) {func();}

   };

   void main( )

   {

         B b;

         A&a=b;

   }

   输出为:

36.#include <iostream.h>

   class My Class {

      public:

         int number;

        void set(int i);

   };

   int number=3;

   void MyClass::set (int i)

   {

         number=i;

   }

   void main()

   {

         MyClass my1;

         int number=10;

         my1.set(5);

         cout<<my1.number<<end1;

         my1.set(number);

         cout<<my1.number<<endl;

         my1.set(::number);

         cout<<my1.number;

   }

   输出为:

  • 11
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 面向对象程序设计习题库是一个用于学习和练习面向对象程序设计的资源库。它通常包含一系列习题,每个习题都涉及到了面向对象程序设计的相关概念和技术。通过完成这些习题,学习者可以加深对面向对象程序设计的理解,并提升自己的编程能力。 在习题习题通常会包括问题描述、要求和示例代码。学习者需要根据问题描述,设计和实现符合要求的面向对象程序。在解决问题的过程,学习者需要运用面向对象程序设计的原则和方法,如封装继承、多态等。完成习题后,学习者可以通过对比自己的解答和示例代码,进行自我评估和反思,进一步提高自己的编程水平。 面向对象程序设计习题库的好处是多方面的。首先,它提供了一个系统的学习资源,帮助学习者从理论到践,逐步掌握面向对象程序设计的基本概念和技巧。其次,习题库的多样性和复杂性有助于学习者在际问题培养设计和解决问题的能力。此外,通过独立思考和解决问题的过程,学习者可以提高自己的自学和解决问题的能力,培养创造力和逻辑思维。 总之,面向对象程序设计习题库是一个有助于学习和练习面向对象程序设计的资源库。通过完成习题,学习者可以提升自己的编程水平和解决问题的能力,为未来的面向对象程序设计工作做好准备。 ### 回答2: C 面向对象程序设计习题库是一个专门用于训练和提高C语言面向对象程序设计能力的资源库。该习题库提供了大量的编程题目,旨在帮助学习者通过践来巩固对C语言面向对象编程的理解和应用。习题的题目分布在不同的难度级别,从基础的面向对象概念练习到复杂的项目践,逐渐提高学习者的编程技能。通过解答这些习题,学习者可以逐步掌握面向对象程序设计的类、对象继承、多态等基本概念和技巧,并能将其运用到际项目。 C语言是一种面向过程的编程语言,而面向对象程序设计则是一种更高级、更抽象的编程范式,可以更加灵活地设计和组织程序结构。通过习题库的训练,学习者可以在C语言实现面向对象程序设计思想,提高代码的可读性、可维护性和可复用性。 习题库提供了丰富的案例和示例代码,学习者可以参考其实现方法和思路,帮助他们更好地理解和应用面向对象程序设计的思想。此外,习题库还提供了测试用例和答案解析,供学习者自测和对照,及时发现和纠正自己的错误。 总之,C面向对象程序设计习题库是一个有助于学习者提高C语言面向对象编程能力的资源库,通过解答其的题目,学习者可以巩固对面向对象编程的理解和应用,并能够更好地运用到际项目。 ### 回答3: C++面向对象程序设计习题库是一种提供给学习者用于践和巩固面向对象编程概念的资源。这种习题库包含了一系列与C++编程相关的问题和练习,旨在帮助学习者通过践来深入了解和掌握面向对象的思想和技术。 习题的问题通常涉及到类、对象继承、多态、封装等方面的概念和技术。通过完成这些问题,学习者可以巩固自己对于这些概念的理解,并且能够通过编写和调试代码来加深对于它们的应用。 C++面向对象程序设计习题库的设计通常会从简单到复杂逐渐升级,以满足不同层次学习者的需求。学习者可以根据自身的水平选择适合自己的习题,并按照要求完成相应的验或编码练习。 通过使用这种习题库,学习者可以更加深入地理解和应用面向对象编程的思想和技术,提高自己的编程能力和解决问题的能力。同时,习题库的践性和综合性也能够帮助学习者将抽象的理论知识转化为具体的代码实现,加深对于编程语言的理解和熟练度。 总之,C++面向对象程序设计习题库是一种非常有益的资源,它通过践和练习帮助学习者巩固和提升自己的面向对象编程能力,是学习C++的重要辅助工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁佰_542586

天桥底下的穷屌丝和他の破鞋草席

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值