资源描述
系领导
审批并署名
A / B卷
广州大学 2023~2023 学年第 一 学期考试卷
课程 面向对象程序设计 考试形式(闭卷,考试)
学院 系 专业 班级 学号 姓名
题次
一
二
三
四
五
六
七
八
九
十
总分
评卷人
分数
20
20
40
20
100
评分
一、 填空题(20分)
1、 __ ___是特殊的成员函数,在对象作用域结束时自动调用。
2、 友元关系是非传递的和_ ____,除非特别声明,否则,通常情况下若F是A的友元,A__ ___F的友元。
3、 运算符函数既可以重载为_ __函数,也可以重载为友元函数。
4、 在具有继承关系的类层次结构中,构造函数的执行顺序是:_ __、_ _ _、 。
5、 具有纯虚函数的类称为__ ___。
6、 Windows应用程序的主窗口一般都是_ _类的派生类,而窗口函数则被封装到_ __类中。
7、 MFC是用消息映射表来实现消息与 ___之间的映射的,MFC通过_ __ __个宏来声明和实现消息映射表。
8、 MFC采用 结构来实现数据和数据显示的分离。应用程序的数据是由文档类_ _对象来存储和管理。
9、 CPaintDC是_ __类中最常用的派生类,它只能使用在 _ __类的OnDraw函数中。
10、 消息 的消息响应函数的函数名为OnMouseMove。
11、 是供Windows应用程序使用的特殊数据,它们驻留在硬盘上的可执行文献中。常用的资源有 、快捷键、图标、位图等。
12、 _ ___就是指应用程序把数据对象以文献的形式写入永久性存储体后,应用程序还能从永久性存储体来读取它,并且可以依据该文献在内存中重新创建该对象的机制。。
二、简述题(20分,每题5分)
(1)Windows应用程序的主函数有哪3个重要任务? 什么是消息循环?
(2)简述文档/视图结构中文档类和视图类的作用。并说明在文档/视图结构的应用程序中,视图类的对象是如何来获取文档类对象中的数据的。
(3)应用程序的界面有哪三种方式?分别说明该界面应用程序的外观。
(4) 鼠标消息分为哪两类?它们之间有什么区别?
三、阅读下列程序,写出执行结果。(40分,每题5分)
1、#include<iostream.h>
class counter
{ public :
void setnum ( int i ) { num = i ; }
void shownum ( ) { cout << num << '\t' ; }
static int num ;
} ;
int counter :: num = 1 ;
void main()
{ int i ;
for( i = 0 ; i < 5 ; i ++ )
{ counter::num += i ;
cout << counter::num << '\t' ; }
cout<<endl;
}
2、#include <iostream.h>
class A
{public:
A(){a=5;}
void printa(){cout<<"A:a="<<a<<endl;}
private:
int a;
friend class B;
};
class B
{public:
void display1(A t){t.a++; cout<<"display1:a="<<t.a<<endl;}
void display2(A t){t.a--; cout<<"display2:a="<<t.a<<endl;}
};
void main()
{ A obj1; B obj2;
obj1.printa();
obj2.display1(obj1);
obj2.display2(obj1);
obj1.printa();
}
3、#include <iostream.h>
template <typename T>
class base
{public:
base(T i,T j){x=i; y=j;}
T sum(){return x+y;}
private: T x,y;
};
void main( )
{ base <double> obj2(3.3,5.5);
cout<<obj2.sum()<<endl;
base <int> obj1(3,5);
cout<<obj1.sum()<<endl;
}
4、#include<iostream.h>
class Base
{ public: void abc(){cout<<"Base class"<<endl;};
};
class Derived1: public Base
{ public: void abc(){cout<<"Derived1 class"<<endl;};
};
class Derived2: public Base
{ public: void abc(){cout<<"Derived2 class"<<endl;};
};
void main()
{ Base obj1, *p; Derived1 obj2; Derived2 obj3;
p=&obj1; p->abc();
p=&obj2; p->abc();
p=&obj3; p->abc();
obj1.abc(); obj2.abc(); obj3.abc();
}
5、#include <iostream.h>
class parent_class
{ int private1 , private2 ;
public :
parent_class ( int p1 , int p2 )
{ private1 = p1; private2 = p2; }
int inc1 ()
{ return ++ private1; }
int inc2 ()
{ return ++ private2 ; }
void display ()
{cout << "private1=" << private1 << " , private2=" << private2 << endl ; }
};
class derived_class : private parent_class
{ int private3 ;
parent_class private4 ;
public:
derived_class ( int p1 , int p2 , int p3 , int p4 , int p5 ): parent_class ( p1 , p2 ) , private4 ( p3 , p4 )
{ private3 = p5 ; }
int inc1 ( )
{ return parent_class :: inc1 ( ) ; }
int inc3 ( )
{ return ++ private3 ; }
void display ( )
{ parent_class :: display ( ) ; private4.display ( ) ;
cout << "private3=" << private3 << endl ; }
} ;
void main ( )
{ derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ;
d1 . inc1 ( ) ;
d1 . display ( ) ;
}
6、#include<iostream.h>
class A
{ public :
A(int n) {i=n ; cout<<“初始化i的值为:”<<get_i()<<’\n’; }
~A() {cout<<“释放A的对象。”<<’\n’ ; }
int get_i () {return i ;}
private : int i ;
} ;
class B : public A
{ public :
B(int n, int m) : A(n){ j=m ; cout<<“初始化j的值为:”<<get_j()<<’\n’ ; }
~B(){ cout<<“释放B的对象。”<<’\n’ ;}
int get_j () { return j ;}
private : int j ;
} ;
void main()
{B obj (1,2) ;
cout<<“创建了一个B的对象。值为: ”<<obj.get_i()<<“ ”<<obj.get_j()<<’\n’ ;
}
7、#include<iostream.h>
class A
{ public:
virtual void act1();
void act2() {act1();}
};
void A::act1(){ cout<<"A::act1() called. "<<endl;}
class B : public A
{ public:
void act1();
};
void B::act1(){ cout<<"B::act1() called. "<<endl;}
void main()
{ B b;
b.act2();
}
8、指出下列程序中的错误,并说明理由
class COMPLEX
{ public :
COMPLEX(double r=0, double i=0) ;
COMPLEX operator-(const COMPLEX & other) ;
COMPLEX operator=(const COMPLEX & other) ;
private :
double real=0, image=0 ;
};
void main()
{ float x ;
COMPLEX y (10,20), z (2,3), sum ;
sum= x-y ;
sum=sum-z ;
sum-- ;
}
四、编程题:(20分,每题10分)
1.使用虚函数编程求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类circle 作为基类。在 circle 类中定义一个数据成员 radius 和两个虚函数area( ) 和 volume( ) 。由circle 类派生 sphere 类和 column 类。在派生类中对虚函数 area( ) 和 vlume( ) 重新定义,分别求球体和圆柱体的体积及表面积。补充指定部分。
#include<iostream.h>
const double PI=3.14;
class circle
{public:
circle(double r){radius=r;}
//补充此处
protected:
double radius;
};
class sphere:public circle
{public:
sphere(double r):circle(r){}
double area(){return 4.0*PI*radius*radius;}
double volume()
{return 4.0*PI*radius*radius*radius/3.0;}
};
class column: public circle
{ //补充此处
};
void main()
{int a,b,c;
circle *p;
cout<<"输入球体半径"<<endl;
cin>>a;
sphere sobj(a);
p=&sobj;
cout<<"球体的体积="<< //补充此处
cout<<"球体的表面积="<< //补充此处
cout<<"输入圆柱体的半径,高"<<endl;
cin>>b>>c;
column cobj(b,c);
p=&cobj;
cout<<"圆柱体的体积="<<p->volume()<<endl;
cout<<"圆柱体的表面积="<<p->area()<<endl;
}
2.使用成员函数或友员函数编程序重载运算符“+”,使该运算符能实现两个字符串的连接。
展开阅读全文