C++期末复习试卷C

  • 格式:doc
  • 大小:59.00 KB
  • 文档页数:9

参考答案 第1页

计算机 专业《面向对象程序设计C++》试卷(C卷)(闭卷)

班级 姓名 学号

一、判断题:(10分)(共10小题,每小题1分)

1. 构造函数和析构函数都没有返回类型。

2. 构造函数可以设置默认参数。

3. 可以让派生类指针直接指向基类对象。

4. 面向对象中的类与对象之间是一对一的关系。

5. 若一个类为抽象类,则不能实例化该类。

6. 函数内的局部对象在退出函数后将调用析构函数释放。

7. 定义int (*pa)(int); 表示pa是指向具有一个int形参、返回类型为int的函数指针。

8. STL中的stack支持迭代器访问。

9. 重载函数形参个数必须不同。

10. 派生类对象的构造过程是先构造对象成员,再构造自身,最后构造基类。

二、单选题:(20分)(共10小题,每小题2分)

1. 假设X为一个自定义类且定义其对象a,则语句X b=a; 将调用_________函数。

A. 析构函数 B. 赋值运算符函数 C. 拷贝构造函数 D. 以上答案都不对

2. 下列关于虚继承的说法错误的是_____________。

A. 采用虚继承的目的是为了消除多重继承带来的二义性问题

B. 虚基类成员的构造只需在其直接派生类的构造函数初始化列表中进行初始化

C. 在同一层次中,虚基类的构造函数在非虚基类之前调用

D. 在同一层次中包含多个虚基类,这些虚基类的构造函数按照说明的先后次序调用。

3. 有关以下代码的说法正确的是___________。

string& GetString(){

string s = "Hello, World!";

return s;

}

void main(){

cout<

}

A. cout无法输出引用类型的数据 B. GetString函数返回局部对象的引用将导致错误

C. return s;语句将调用拷贝构造函数并返回 D. 程序正常输出Hello, World! 题号 一 二 三 四 五 总分

分值 10 20 20 20 30 100

得分 参考答案 第2页

4. 下列代码中的哪个语句有语法错误___________。

class B{

protected:

int x;

public:

void f(){}

};

class D: private B{

int y;

public:

void g(){

x = 1; //语句1

f(); //语句2

}

};

void main(){

B b;

D d;

b.x=1; //语句3

d.g(); //语句4

}

A. 语句1 B. 语句2 C. 语句3 D. 语句4

5. 以下代码将调用拷贝构造函数的次数是________。

Id f1(Id param) { return param; }

Id f2(Id& param) { return param; }

Id &f3(Id& param) { return param; }

int main() {

Id id0;

f1(id0);

f2(id0);

f3(id0);

}

A. 3次 B. 4次 C. 5次 D. 6次

6. 以下程序的输出结果是____________。

#define max(a,b) ((a) > (b) ? (a) : (b))

int main() {

int i = 5, j = 6;

printf("%d\n", max(i--,j--));

}

A. 4 B. 5 C. 6 D. 程序语法错误

参考答案 第3页

7. 关于以下程序块的说法正确的选项是__________。

int a[5] = {1, 2, 3}, b[3]={1, 2, 3}, c[3]={1, 3, 4};

if(a==b)

cout<<"Equal"<

if(a>b)

cout<<"Larger"<

A. 因为a和b数组元素完全一样,因此能输出语句1

B. 因为a在b之前定义,因此一定能输出语句2

C. 因为a和b的对应不同的内存单元,因此一定不能输出语句1

D. 因为b的分配一定在a之后,因此一定不能输出语句2

8. 关于以下程序块的说法错误的选项是__________。

char* str;

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

str[i] = i+'A';

cout<

A. str指针是一个野指针,需要分配内存方可使用

B. str是一个指针,无法通过下标形式str[i]来访问

C. str需要在末尾加上结束符才可以正常输出

D. 对str分配内存的方式可以使用str = new char[100];

9. 若指针作实参,形参定义为数组,函数调用时实参传递给形参的是______。

A. 指针所指向的数组长度 B. 指针变量中的地址值

C. 指针所指向的数组所有元素的值 D. 指针变量所在的内存空间

10. 执行以下程序段后s的值是________。

string s = "1";

s += "23";

A. 1 B. 123 C. 24 D. 231

三、程序填空题:(20分)(共10个空格,每格2分)

1. 以下程序自定义了一个整型栈类MyStack,Push具有入栈功能、Pop具有弹栈功能。请将空格部分填写完整,使程序功能正确。

#include

using namespace std;

class MyStack {

public:

void Pop(){

if( (1) ){//判断栈空

cout<<"Empty Stack";

return;

}

nTop--;

} 参考答案 第4页

void Push(int e){

if( (2) ){//判断栈满

cout<<"Full Stack";

return;

}

nTop++;

elem[nTop]=e;

}

MyStack(const int n){

(3) ;//初始化成员elem

nTop=nBase=0;

maxsize=n;

}

virtual ~MyStack(){ (4) ;}//释放elem成员

private:

int* elem;

int nTop;

int nBase;

int maxsize;

};

2. 请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为5。

#include

class Integer {

int x;

public:

Integer(int a=0){x=a;}

void display(){cout<

(5) ;

};

Integer Max(Integer a,Integer b) {

if( (6) ) return a;

return b;

}

void main() {

Integer a(3),b(5),c;

(7) ;

c.display();

}

3. 以下swap函数模板用于交换两个元素,请将程序补充完整。

#include

#include

using namespace std;

(8)

void swap(T *x, T *y){ 参考答案 第5页

(9) ;

temp = *x ;

(10) ;

*y = temp ;

}

四、程序分析题:(20分)(共3小题,第1、2题每题5分,第3题10分)

1. 写出以下程序的输出结果,并分析原因。(5分)

#include

int main( ){

int num=50;

int& ref=num;

ref=ref+10;

cout << "num=" << num << endl;

num=num+40;

cout<< "ref=" << ref << endl;

return 0;

}

2. 写出以下程序的输出结果,并分析原因。(5分)

#include

class A{

public:

virtual void f(){

cout<<"In A"<

}

};

class B : public A{

public:

void f(){

cout<<"In B"<

}

};

void Test(A &t){

t.f();

}

void main(){

A a;

B b;

b.f();

Test(a);

Test(b);

}

3. 请分析以下程序的功能,当输入数据为:

2 3