面向程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
郑州大学现代远程教育
《面向对象程序设计》课程考核要求说明:本课程考核形式为提交作业,完成后请保存为WORD 2003格式的文档,登陆学习平台提交,并检查和确认提交成功(能够下载,并且内容无误即为提交成功)。
一.作业要求
1.请独立自主完成作业内容。
二.作业内容
一)、简答题:(每题 5 分,共30 分)
1、函数模板与函数有何关系?
答:函数模板是一个模板,其中用到通用类型参数,不能直接执行。
函数是一个具体的函数,有具体的程序代码,可以执行。
函数模板是用来生产具体函数的。
2、类模板与类有和关系?
答:类模板使用户可以为类定义一种模式,使得类中的某些数据成员、成员函数的参数和返回值能取任意数据类型。
类模板用于实现类所需数据的类型参数化。
类是将数据和数据操作函数结合于一个单元内的机制,是一种用户自定义的数据类型。
类模板是用来产生类的。
3、什么是继承?
答:继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,并增加功能。
作为类
的构造机制,继承通过扩充、组合现有的类来构造新的类。
4、继承方式有哪些?产生的结果是什么?
答:继承方式有公有继承、私有继承、保护继承。
当继承方式是公有继承时,基类的public 和protected成员分别作为派生类的public 和protected成员,派生类的其他成员可以直接访问它们。
当继承方式是私有继承时,基类public和protected成员被继承后作为派生类的私有成员,派生类的其他成员可以直接访问它们,但是在类外部通过派生类的对象无法访问它们。
当继承方式是保护继承时,基类的public和protected成员被继承以后作为派生类的保护成员,这样派生类的其他成员就可以直接访问它们,但在类外部通过派生类的对象无法访问。
5、什么是动态绑定?
答:函数绑定分为静态绑定和动态绑定两种形式,两者的区别在于:静态绑定在程序执行前完成,由编译系统或操作系统装入程序计算函数的入口地址;而动态绑定则在程序执行过程中完成,由程序自身计算函数的入口地址。
6、什么是抽象类?有何特点?
答:抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的上层。
抽象类的主要作用是将有关的类组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。
(1)抽象类只能用作其他类的基类,不能建立抽象类对象。
(2)抽象类不能用作参数类型、函数返回类型或显式转换的类型。
(3)可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。
二)、分析下面的代码,回答问题(每题 10 分,共 40 分)
1.下面程序的执行结果是什么?为什么?
class B{
protected:
virtual void f( ){cout<<"B"<<endl;}
public:
void g( ){f( );}
};
class C:public B{
protected:
void f( ){cout<<"C"<<endl;}
};
void main( ) {
C d;
d.g( );
}
答:输出 C,因为创建C类型的对象调用其父类的函数g g中调用f 类中函数参数默认始终有一个this指针,这个调用的this指向的就是d对象调用g,g中调用f产生this->f()调用C中的f。
2.下面程序的执行结果是什么?为什么?
class BC {
public:
BC( ) { cout << "BC' constructor\n"; }
~BC( ) { cout << "BC' destructor\n"; }
};
class DC : public BC {
public:
DC( ) { cout << "DC' constructor\n"; }
~DC( ) { cout << "DC' destructor\n"; }
};
int main( ) {
DC d;
return 0;
}
答:BC' constructor DC' constructor DC' destructor BC' destructor
因为创建子类对象首先创建基类对象调用基类构造函数,然后调用自己的构造函数,释放时先析构自己对象最后析构父类对象,有父才有子。
3. 下面程序的执行结果是什么?为什么?
void main()
{
char* pn[]={"Fred","Barney","Wilma","Betty",NULL};
print(pn);
}
void print(char* arr[])
{
while(*arr!=NULL){
cout << *arr <<endl;
arr++;
}
}
答:输出:Fred Barney Wilma Betty
while循环语句,*arr!=NULL,则依次输出,每次输出后arr++,至NULL结束。
4.下面程序的执行结果是什么?为什么?
class B
{
int b;
public:
B(){};
B(int i){b=i;};
virtual void func()
{
cout<<"B::func() called"<<endl;
}
};
class D:public B
{
public:
D(){};
D(int i, int j):B(j){d=j;}
private:
int d;
void func()
{
cout<<"D::func() called"<<endl;
};
};
void gfunc(B *obj)
{
obj->func();
}
void main()
{
D *pd=new D;
gfunc(pd);
}
答:结果为D::func() called
C++的多态特性子类指针pd传入全函数,而函数参数是基类指针,一个指向子类对象的基类指针调用,就会产生多态(前提有虚函数重载),子类重新实现了虚函数。
三)、根据要求编写程序:(每题15分,共 30 分)
1. 设计一个职工类Person,一个系有若干个职工,按职务分为系主任、室主任和职工,给出他们之间的领导关系。
答:类person有姓名、职务和指向领导的指针等私有数据,以及两个构造函数和以下成员函数:setleader()(设置当前职工的领导);getname()(获取职工姓名);getleader()(获取领导者对象指针);disp()(输出姓名和职务)。
本题程序如下:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
class person
{
char name[10];
char prof[10];
person *leader;
public:
person(){strcpy(name,"\0");}
person(char n[],char p[])
{
strcpy(name,n);
strcpy(prof,p);
leader=new person;
}
void setleader(person &p){leader=&p;} // 对象引用作为参数
char *getname(){ return name;}
person *getleader()
{
return leader;
}
void disp()
{
printf("%10s %10s%",name,prof);
}
};
void main()
{
person p[]={person("张阳","室主任"),person("卫兵","职工"), |
person("车晓","系主任"),person("王峰","职工"),person("张进","室主任"),person("戴志","职工")};
p[0].setleader(p[2]);
p[1].setleader(p[0]);
p[3].setleader(p[4]);
p[4].setleader(p[2]);
p[5].setleader(p[4]);
printf(" 姓名职务领导姓名\n");
printf("------------------------------\n");
for(int i=0;i<6;i++)
{
p[i].disp();
printf("%10s\n",(p[i].getleader())->getname());
}
}
2. 设计High类,其数据成员为高h,定义虚函数disp()。
由High 派生出长方体类Cuboid与圆柱体类Cylinder。
并在两个派生类中定义成员函数disp()为虚函数。
在主函数中用基类High定义指针变量p,然后用指针p动态调用基类与派生类中虚函数disp(),显示长方体与圆柱体的体积。
答:#include<iostream>
using namespace std;
class High
{
public: High(float height):h(height){}
virtual float disp();
protected: float h; };
class Cuboid:public High
{ public: Cuboid(float height,float l,float w):High( height),len(l),width(w){}
virtual float disp();
private:
float len;
float width; };
class Cylinder:public High { public: Cylinder(float height,float rr):High(height),r(rr){}
virtual float disp();
private:
float r; };
float High::disp()
{ return h;
}
float Cuboid::disp()
{ return h*len*width;
float Cylinder::disp()
{ return 3.14159*r*r*h; }
int main()
{ Cuboid cub(5,10,10);
Cylinder cy(10,10);
High *p;
p=&cub;
cout<<"长方体的体积:"<<p->disp()<<endl; p=&cy; cout<<"圆柱体的体积:"<<p->disp()<<endl; return 0; }。