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.82.改正以下程序类定义部分中的错误。 #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 / 8Point 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 / 8ptr = &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