网院作业 发表于 2021-8-5 08:43:40

面向对象程序设计C++模拟试卷21秋西电答案

面向对象程序设计C++模拟试卷
考试时间:90分钟
一.简答题(10分,每题2分)
1.1(3分) C++语言中的break语句和continue语句的作用分别是什么?
答案:break语句的作用是退出其所在的循环(1分);continue语句的作用是结束本次循环,转去判断是否还需要再执行下一次循环(2分)。

1.2(3分) 什么是函数重载?实现函数重载的原则是什么?
答案:函数重载是指同一个作用域内相同的函数名对应着不同的实现。在调用时,系统将根据调用函数的实参情况来选择某个实现(2分)。
实现函数重载的原则是要求被重载的同名函数中,其参数个数、类型或顺序必须有所不同(1分)。

1.3(4分)什么是this指针?它有何作用?
答案:this指针是系统自动生成的,指向当前对象的指针。(1分)
它的用途在于直接用它可以表示当前对象的指针,而使用*this可以表示当前对象。但程序中出现一个对象调用某个成员函数时,系统自动生成一个指向该对象的指针this,并将该对象的地址值赋给它。一般情况下,this指针被隐含使用,但有时也可以显式使用。(3分)

二.填空题(20分,每空2分)
2.1 纯虚函数就是                  的虚函数,至少包含一个纯虚函数的类称为               。
答案:没有函数体,抽象类

2.2C++语言引入了异常处理机制,用             语句“抛出”异常,然后用相应的语句_            捕获被“抛出”的异常,并做出相应的处理。
答案:throw,catch

2.3假设x = 5,y = 0,z = 3,则表达式 !x || y++ && z 的值为      ,执行表达式后y的值为      。
答案:0,1

2.4下列程序在构造函数和析构函数中申请和释放类的私有成员,请完成该类的实现。
class MyClass{
private:
      int *x;
public:
      MyClass(int a);
      ~MyClass();
};
MyClass :: MyClass(int a) {                  ; }
MyClass :: ~MyClass() {                  ;}
答案:x = new int a,delete x

2.5 C++语言中,运算符重载一般采用两种形式:                和                。
答案:成员函数,友元函数(答案顺序可以交换)

三.单项选择题(20分,每题1分)
3.1 在下面的程序中,若实参a与形参x以引用传递的方式传递信息,实参b与形参y以值传递的方式传递信息,那么从函数compute返回主程序后,a和b的值分别为      。
                Main Program               void compute(x, y)



A. 5和2                        B. 5和12                        C. 1和2                    D. 1和12
答案:A

3.2下列语句中,错误的是                  。
A. int i, *ptr = &i;                                B. int i; int *ptr; i = *ptr;
C. int *ptr; ptr = 0;                                D. int i = 5; int *ptr; *ptr = &i;
答案:B

3.3 下列对break语句的描述中,不正确的是               。
A. break语句可以用在循环体中,它将使执行流程跳出本层循环
B. break语句可用在switch语句中,它将使执行流程跳出当前switch语句
C. break语句可用在if语句中,它将使执行流程跳出当前if语句
D. break语句在一层循环体中可以出现多次
答案:C

3.4 下列对C++中的派生类的描述中,错误的是            。
    A. 一个派生类可以作为另一个派生类的基类
B. 派生类至少有一个基类
C. 派生类的缺省继承方式是private继承
D. 派生类只继承了基类的公有和保护成员
答案:D

3.5 下列的各种函数中,            不是类的成员函数。
A. 构造函数                        B. 析构函数                        C. 友元函数                        D. 拷贝构造函数
答案:C

3.6 下列对静态数据成员的描述中,错误的是          。
A. 说明静态数据成员时前边要加修饰符static
B. 静态数据成员要在类体外进行初始化
C. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符
D. 静态数据成员不是所有对象所共用的、
答案:D

3.7 下列关于对象数组的描述中,         是错误的。
A. 对象数组的下标是从0开始的
B. 对象数组的数组名是一个常量指针
C. 对象数组的每个元素是同一个类的对象
D. 对象数组只能赋初值,而不能被赋值
答案:D

3.8 下列关于私有继承的描述中,错误的是         。
A. 基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员可以直接访问它们
B. 基类的公有成员和保护成员被继承后作为派生类的私有成员,派生类的其他成员不能直接访问它们
C. 基类的私有成员,派生类的成员和派生类的对象都无法访问
D. 派生类的对象无法访问基类
答案:B

3.9 应在下列程序中的空缺处填入的正确语句是            。
#include <iostream.h>
class Base {
   public:
   void fun(){ cout << "Base::fun" << endl; }
};
class Derived : public Base {
   void fun() {
                  ;   // 显式调用基类的成员函数fun()
      cout << "Derived::fun" << endl;
   }
};
A. fun()                        B. Base.fun()                        C. Base::fun()                D. Base->fun()
答案:C

3.10 下列关于类模板的描述中,不正确的是          。
A. 用类模板定义一个对象时,不能省略实参
B. 类模板只能有类型参数
C. 类模板本身在编译中不会生成任何代码
D. 类模板的成员函数都是模板函数
答案:B

四.读程题(20分,每题5分)
4.1 给出下述源程序的运行结果。
#include <iostream.h>
#include <string>
void main( ) {
   char *p1, *p2, s = "xyz";
   p1 = "abcd";
   p2 = "ABCD";
   strcpy(s+2, strcat(p1+2, p2+1));
   cout << s << endl;
}
答案:xycdBCD

4.2给出下述源程序的运行结果。
#include <iostream.h>
class Base {
public:
   void fun() { cout << "1"; }
};
class Derived : public Base {
public:
   void fun() {
   cout << "2" << endl;
   }
};
void main() {
   Derived a;
   Base *p = &a;
   (*p).fun();
   a.fun();
}
答案:12

4.3 给出下述源程序的运行结果。
#include <iostream.h>
int add(int a, int b = 5);
void main()
{int m = 5;
   cout << "sum1 = " << add(m) << endl;
   cout << "sum2 = " << add(m, add(m)) << endl;
   cout << "sum3 = " << add(m, add(m, add(m))) << endl;
}
int add(int x, int y)
{ return x + y; }
答案:sum1 = 10
      sum2 = 15
      sum3 = 20

4.4 给出下述源程序的运行结果。
#include <iostream.h>
class A {
private:
   int a, b;
public:
   A(int i, int j) { a = i; b = j; }
   void Move(int x, int y) { a += x; b += y; }
   void Show() { cout << "( " << a << ", " << b << " )" << endl; }
};
class B : private A {
public:
   B(int i, int j, int k, int l) : A(i, j) { x = k; y = l; }
   void Show() { cout << x << " ," << y << endl; }
   void fun() { Move(3,5); }
   void f1() { A :: Show(); }
private:
   int x, y;
};
void main() {
   A e(1, 2);
B d(3, 4, 5, 6);
   e.Show();
   d.fun();
   d.Show();
   d.f1();
}
答案:(1, 2)
5, 6
(6. 9)

五.编程题(30分,每题15分)
5.1编写一个函数int deleteARR(int a[], int count),其功能是去掉元素个数为count的整型数组a中的重复元素,并将不重复元素的个数作为函数的返回值。
参考程序:
#include <iostream.h>
int deleteARR(int a[], int count)
{
   int k = 0, j = 1;
   while(j < count) {
   if(a != a)
      a[++k] = a;
      j++;
   }
   return k+1;// 返回数组中不重复元素的个数
}

5.2 设计类Point,包含横、纵两个坐标数据。由类Point派生出类Circle,Circle中包含圆的半径数据,并能够计算圆的面积。给出类Point和Circle的定义与实现。
参考程序:
#include <iostream.h>
class Point {
private:
   int x, y;
public:
   Point(int a, int b) { x = a; y = b; }
   int getx() { return x; }
   int gety() { return y; }
};
class Circle : public Point {
private:
   int r;
public:
   Circle(int a, int b, int c) : Point(a,b) { r = c; }
   int getr() { return r; }
   float area() { return 3.14.159 * r * r; }
};


页: [1]
查看完整版本: 面向对象程序设计C++模拟试卷21秋西电答案