您的当前位置:首页正文

2015-2016年度面向对象程序设计试卷

2024-01-17 来源:爱站旅游
导读2015-2016年度面向对象程序设计试卷
华中科技大学研究生课程考试试卷

课程名称: 面向对象程序设计 课程类别

□公共课 □开卷 √ √ 考核形式 □专业课 □闭卷 2016年1月12日 院系_______________ 学生类别______________考试日期______________

杨卫东、左峥嵘 学号__________________姓名__________________任课教师___________________

一、填空(共15分,每空1分)

1、静态多态性是通过 函数重载、运算符重载、模板 来实现。 2、面向对象的四个基本特性是 抽象 、 多态 、 继承 和 封装 。

3、假定AB为一个类,则执行“AB a(10), b[1],*p[10];”语句时调用该类构造函

数的次数为 2 。

4、C++类成员函数有 public 、 private 、 protected 三种类型。 5、如果将一个对象说明为常对象,则通过该对象只能调用它的 常成员 函数。 6、为使外部函数可访问类的私有成员,需将该函数声明为该类的 友元函数 。 7、类B是由类A以保护方式派生的,则类A中公有访问属性的数据成员在类B中的访问属性为 保护 。

8、+、=、[]、->等四种运算符中,可采用友元函数重载的运算符是 + 。 9、抽象类是指具有 纯虚函数 的类,它只能作为 基类 来使用。

1 / 8

二、简答题(共30分,每小题6分,其中4、5题任选其一作答即可)

1.什么是类模板,类模板声明的一般形式是什么?

答案:

类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。 定义类模板的一般形式是:

template <类型名 参数名1,类型名参数名2,„> class 类名 {

类声明体 };

2.什么是this指针? 它的主要作用是什么?

答案:

this指针:隐含在非静态成员函数中的特殊指针,它是当前正在调用此成员函数的对象的指针。

作用:主要是用于保证访问不能跨界和用于区分不同的对象。成员函数对成员变量的引用实际是通过this指针访问的,也就是说:成员变量this->成员变量;另外,如果成员函数需要访问当前对象,也可以通过this指针,*this就是当前对象。

3.什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?

答案:

多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),再执行派生类的构造函数,析构函数执行顺序,与构造函数完全相反。

4.写出下面程序的运行结果 答案:

constructor B2.2 constructor B1.1 constructor B3.3 constructor A.4 1

2 / 8

2 4,3

#include using namespace std;

class B1{ int b1; public: B1(int i)

{ b1 = i; cout <<\"constructor B1.\"<{ cout<class B2{ int b2; public:

B2(int i)

{ b2 = i; cout<<\"constructor B2.\"<{ cout<class B3{ int b3; public:

B3(int i)

{ b3 = i; cout<<\"constructor B3.\"<class A:public B2, B1{ int a; B3 bb; public:

A(int i,int j, int k, int l):B1(i),bb(k),B2(j) { a=l;cout<<\"constructor A.\"<B1::print();B2::print();

3 / 8

cout<int main() {

A aa(1,2,3,4); aa.print(); return 0; }

5.写出下面程序的运行结果

答案:

6 外部静态对象g_sta_Obj[构造] 7 外部对象g_glb_Obj[构造]

4 main内动态分配对象m_all_Obj[构造] 4 main内动态分配对象m_all_Obj 5 main内调用fun函数 1 fun内

2 fun内自动对象fun_Obj[构造] 3 fun内静态对象fun_sta_Obj[构造] 2 fun内自动对象fun_Obj[析构]

4 main内动态分配对象m_all_Obj[析构] 3 fun内静态对象fun_sta_Obj[析构]

#include #include using namespace std;

class A {

char string[80]; public :

void show(); A(char * st); ~A( ); };

A::A(char * st)

{ strcpy(string, st);

4 / 8

cout << string << \"[构造]\" << endl; }

A::~A( )

{ cout << string << \"[析构]\" << endl; }

void A::show() {

cout << string << endl; }

void fun( ) {

cout << \"1 fun内\" << endl;

A fun_Obj(\"2 fun内自动对象fun_Obj\");

static A fun_sta_Obj(\"3 fun内静态对象fun_sta_Obj\"); }

void main( ) {

A *ptrA = new A(\"4 main内动态分配对象m_all_Obj\"); if(ptrA==NULL) return;

ptrA->show();

cout<<\"5 main内调用fun函数\"<< endl; fun( );

delete ptrA; }

static A g_sta_Obj(\"6 外部静态对象g_sta_Obj\"); A g_glb_Obj(\"7 外部对象g_glb_Obj\");

6.写出下面程序的输出结果 答案:

a = 2 , b = 4 a = 2 , b = 6 a = 2 , b = 4 a = 2 , b = 6

5 / 8

#include using namespace std;

class A{ public:

virtual void Print(int a, int b=4)

{ cout << \"a = \" << a << \" , b = \" << b << endl; } };

class B : public A { public:

virtual void Print(int a)

{ cout << \"a = \" << a << endl; } virtual void Print(int a, double d)

{ cout << \"a = \" << a << \" , d = \" << d << endl; } };

void Show(A * p) {

p -> Print( 2 ); p -> Print( 2, 6.9 ); }

void main( ) {

A * pa = new A; B * pb = new B; Show(pa); Show(pb); delete pa; delete pb; }

三、改错题(共25分,每小题5分)

1.指出下面的代码中的一处错误,并更正后写出运行结果。 #include using namespace std;

template class A {

private:

6 / 8

T x,y,s; public:

A(T a,T b) {x=a,y=b;s=x+y;}

void show() {cout<<\"x+y=\"<void main() {

A add(1.5,5.3); add.show(); }

答案:

A add(1.5,5.3); 或 x+y=6.8

2.改正以下程序类定义部分中的错误。 #include using namespace std; class Point {

private: int x,y; public:

Point(int i,int j) {x=i,y=j;}

void setxy(int i,int j) {x=i;y=j;} int getx(){return x;} int gety(){return y;} };

void main() {

Point pt;

pt.setxy(10,10);

cout<7 / 8

Point pt(1,1); 或加 Point(){;} 10

3.指出以下程序代码中的错误,并改正。 #include using namespace std; class Container {

protected:

double area; public:

virtual double GetArea()=0; };

class Sphere:public Container {

private:

double r; public:

Sphere(double a){ r=a;}

virtual double GetArea(){area = 4*3.14159*r*r;} };

class Cube:public Container {

private:

double h; public:

Cube(double a){ h=a;}

virtual double GetArea(){area = h*h*6;} };

void main() {

Cube C(10), *ptr; Sphere S(10); ptr = &C;

cout<<\"Cube's area is \"<GetArea()<8 / 8

ptr = &S;

cout<<\"Sphere's area is \"<GetArea()<}

答案:

virtual double GetArea(){area = 4*3.14159*r*r; return area;} virtual double GetArea(){area = h*h*6; return area;} ptr = (Cube*) &S; Cube's area is 600

Sphere's area is 1256.64

4. 指出以下程序代码中的错误,并改之。 #include using namespace std;

class A1{ public:

virtual cal(); };

class A2: public A1{ void print();

};

class A3: public A2{ public:

virtual cal(){cout<<\"A3::cal()\"<void main() {

A3 a3; a3.cal(); }

答案:

virtual cal()=0; A3::cal()

5. 以下程序可动态分配二维数组并释放内存,且可实现二维指针和一维指针复用,试问程序能否正常运行,如不能运行找出原因并改正之。

9 / 8

#include #include

using namespace std;

void ** fspace_2d(int row,int col,int lenth) {

char *p = (char *)calloc(lenth, row*col);

void **b = (void **)calloc(sizeof(void *),row); for(int i=0;ib[i] = (void*) (p + i*col*lenth); return(b); }

void ffree_2d(void **a,int row) {

for( int i=0;ivoid main() {

int r=5, c=10;

float ** pArray2D = (float **) fspace_2d( r, c, sizeof(float) ); ffree_2d( (void**) pArray2D, r); }

答案:

编译可通过,运行内存访问错。 ffree_2d函数体改写为

void ffree_2d(void **a, int row) {

free(a[0]); free(a); }

10 / 8

四、写程序题(共30分)

1、建立一个字符串类用于存储和处理字符串,采用成员函数对操作符‘+’进行重载,以实现两个字符串的合并功能。(10分)

2、写一个具有动态多态性的学生和教师信息输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名、输入和显示设计成一个抽象类person的成员,并将person类作为学生数据操作类student和教师操作类teacher的基类。程序应能根据待输入人员的类别完成对应人员信息的输入和显示功能。(20分)

11 / 8

因篇幅问题不能全部显示,请点此查看更多更全内容