一. 单选题(共15分,每小题3分)。 1.包含纯虚函数的类是_____。 (A) 基类。 (B) 派生类。 (C) 抽象类。 (D) 虚基类。 2.对A *p用new A或(A *)malloc(sizeof (A))赋值,如下叙述正确的是_____。 (A) new分配内存后会调用构造函数初始化,但malloc函数不会。 (B) malloc分配内存后会调用构造函数初始化,但new函数不会。 (C) new和malloc分配内存后都会调用构造函数初始化。 (D) new和malloc分配内存后都不会调用构造函数初始化。 3.表达式“sizeof(int [1][2])/sizeof(int)”的值为_____。 (A) 1。 (B) 2。 (C) 3。 (D) 4。 4.类A定义了构造函数A( )、A(int)、A(int,int)、A(int,int,int),则new A[2][3]会调用_____。 (A) A( )。 (B) A(int)。 (C) A(int, int)。(D) A(int, int, int)。 5.指向类A的一个非静态整型只读成员的非只读指针p定义为_____。 (A) const int A::*const p; (B) int A::* const p; (C) int A::* p; (D) const int A::* p;
得分 评卷人
二. 指出以下各类可访问的成员及其访问权限(共20分,小题分数各为3分、3分、6分、8分)。 (1) class A{ int m; private: int n; protected: int o; public: int p; }; (2) struct B: A{ int a; protected: int b; A::o; public: int c; A::p; }; (3) struct C: A{ int a; private: int b; protected: int c; public: int d; }; (4) class D: protected B, C{ int e; private: int f; protected: int g; public: int h; };
得分 评卷人
三. 指出main中每行的输出结果(共20分,每行的分值依次为1,2,3,4,5,5分)。 #include <iostream.h> struct A{A( ){ cout<<'A';}}; struct B{A a; B( ):a( ){ cout<<'B';}}; struct C: A{ B b; C( ):A( ){ cout<<'C';}}; struct D: virtual B, virtual C{B b; D( ){ cout<<'D';}}; struct E: A, C{ D d; E( ):d( ){ cout<<'E';} }; struct F: virtual B, C, virtual D, E{ E e; F( ):E( ), e( ){ cout<<'F';} }; void main( ){ A a; cout<<' '; //输出= B b; cout<<' '; //输出= C c; cout<<' '; //输出= D d; cout<<' '; //输出= E e; cout<<' '; //输出= F f ; cout<<' '; //输出= }
得分 评卷人
四. 指出以下程序的语法错误及其原因(共15分,每个错误大约1分)。 typedef int * CP; class A{ int a; protected: static int g ( )volatile{ return 2; }; public: const int c; A(int x) { a=c=x; }; virtual operator int( ){ return a+c; }; } a=2; struct B: A{ int d; public: A::g; B(int x){ d=x;} ; } b=(2,3); class C: B{ int e; virtual C( ){ e=0; }; virtual ~C( ){ }; }c, *const p; const CP r; void main( ){ int A::**const*q, i; i=a.a; i=A(B(i)); b.c=b+c; q=&A::c; i=a.****q; return i; }
得分 评卷人
五. 指出main变量i在每条赋值语句执行后的值(共15分,每个i值大约2分)。 int x=2, y=x+3; struct A{ int x; static int y; public: operator int( ){ return x*y; } int &h(int &x){ for(int y=x; x<2*y; x+=5, y+=2) if (x>3*y+7) x-=y; return x; } A &operator ++( ){ x++; y++; return *this; } A(int x=3, int y=::y+2): x(x+::x) { this->y=y; } }; int A::y=::y; void main( ){ A a(3,2), b(7), c; int i, &m=i, A::*p=&A::x; i=A::y; //i= m=b.x; //i= i=b.*p; //i= i=b+A(A(3)); //i= m=++a; //i= b.h(m)=9; //i= i=b.h(m)-c.x; //i= }
得分 评卷人
六. 如图所示,用对顶生长的双栈模拟一个队列,栈1的入栈作为队列元素的入口(队尾),栈2的出 栈作为对列元素的出口(队首)。当栈2非空时,不得将栈1的元素弹出压入栈2;只有在栈2为空时,才能将栈1的元素弹出压入栈2,且必须全部弹出压入栈2。编写队列类QUEUE中的所有函数 (共15分,每个函数2.5分)。 class QUEUE{ int *const e; //用于存放队列元素 int p1, p2; //双栈中栈1和栈2的顶(当前空位) const int m; //队列能存放的最大元素个数 public: QUEUE (int m); //一共能存放的最大元素个数m QUEUE (const QUEUE &t); //用队列对象t构造一个新对象 virtual QUEUE & operator = ( const QUEUE &b); //队列对象赋值 virtual QUEUE & operator << ( int k); //元素k放入队列 virtual QUEUE & operator >> ( int &k); //从队列取出元素放入k virtual ~ QUEUE ( ); }; |