郑州大学《面向对象程序设计》课程作业doc.docx
《郑州大学《面向对象程序设计》课程作业doc.docx》由会员分享,可在线阅读,更多相关《郑州大学《面向对象程序设计》课程作业doc.docx(10页珍藏版)》请在冰豆网上搜索。
郑州大学《面向对象程序设计》课程作业doc
郑州大学现代远程教育《面向对象程序设计》课程考核要求
说明:
本课程考核形式为提交作业,完成后请保存为WORD格式的文档,登陆学习平台提交,并检查和确认提交成功。
一.作业要求
1.请独立自主完成作业内容。
二.作业内容
一)、简答题:
(每题5分,共30分)
1、声明类的一般格式是什么?
答:
声明一个类一般格式为:
classCStudent
{public:
protected:
private:
};
2.类的定义层次如下图所示。
请问生成类G的对象时构造函数调用的顺序是怎样的?
答:
如果继承顺序是从左到右的话,那么结果为:
ACDEABFG
3、类成员的访问权限有哪些?
答:
成员的访问权限如下:
Public:
任何人,尤其是那些要使用这个类库的客户程序员,都能访问那个紧跟在public后面声明的成员。
默认的package:
在同一个目录里面的文件,并且都没有明确指明它是属于哪个package的。
Java会认为这类文件是属于这个目录的“默认package”的,因此对这个目录里边的其它文件来说,它们就都是package权限的了。
private:
除非是用这个类(包含这个成员的类)的方法,否则一律不得访问。
package里的其它类也不能访问private成员。
一个package很可能是由好几个人合作开发的,因此private能让你根据自己的需要修改那些成员,而不用担心这么做会不会对别的类产生影响。
protected:
package里面的类,那么你只能访问原先那个package的public成员。
(当然如果是在同一个package里面继承的话,那么你还可以访问package权限的成员。
)有时基类的创建者会希望派生类能访问某个成员,而其它类则不能访问。
这就是protected要做的。
protected也赋予成员package权限——也就是说,同一个package里的其它类也可以访问protected元素。
为了让代码显得更有条理,可能你选用这种风格,就是将public成员都放在类的开头,接下来是protected成员,然后是package权限的,最后是private成员。
这样做的好处就是,当用户从上到下
读代码的时候,会先看到对他们最重要的东西(就是能在文件以外访问的public成员)。
而当他们遇到非public成员的时候,就会知道这是类的内部实现部分,是无法读到的。
4.友元关系具有什么特点?
答:
友元关系有如下特点:
第一、友元函数可以直接通过对象名访问类的私有和保护成员,可以像普通函数一样在任何地方调用。
不是该类的成员函数,可以是一个普通的函数,也可以是其他类的成员函数。
(朋友虽然不是家庭的成员,但容许到我们家里访问一样)
第二、友元函数不属于任何类,因此可以放在类说明的任何位置,既可以在public区,也可以在private区。
(友元函数看看作是类的部分接口,建议出现在public的部分)
第三、友元函数不需要通过对象或对象指针来调用,可以直接调用即可。
5.定义重载运算符函数的时候需要注意哪些问题?
答:
不能改变运算符的优先级。
不能改变运算符的结合性(例如,算术运算符的结合性为从左到右,这一点不能改变)。
默认参数不能喝重载的运算符一起使用,也就是说,在设计运算符重载成员函数时不能使用默认参数。
不能改变运算符的操作数的个数。
不能创建新的运算符,只有已有运算符可以被重载。
运算符作用于C++内部提供的数据类型时,原来含义保持不变
6、什么是模板?
答:
模板把函数或类要处理的数据类型参数化,表现为参数的多态性。
模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递
二)、分析下面的代码,回答问题(每题10分,共40分)
1.下面程序的执行结果是什么?
为什么?
classBC{
public:
BC(){cout<<"BC'constructor\n";}
~BC(){cout<<"BC'destructor\n";}
};
classDC:
publicBC{
public:
DC(){cout<<"DC'constructor\n";}
~DC(){cout<<"DC'destructor\n";}
};
intmain(){
DCd;
return0;
}
答:
执行结果是:
BC' constructor\n
DC' constructor\n
DC' destructor\n
BC' destructor\n
创建子类对象首先创建基类对象调用基类构造函数,然后调用自
己的构造函数,释放时先析构自己对象最后析构父类对象,有父才有子。
2.下面程序的执行结果是什么?
为什么?
classSample{
intn;
public:
Sample(){};
Sample(inti){n=i;};
Sample&operator=(Sample);
voiddisp(){cout<<"n="<};
Sample&Sample:
:
operator=(Samples)
{
Sample:
:
n=s.n;
return*this;}
voidmain()
{Samples1(10),s2;
s2=s1;
s2.disp();
}
答:
结果:
n=10。
原因是Sample重载了赋值操作符,
可以用Sample的一个对象去初使化另一个对象,s2对象被已经初始化的s1所初始化。
3.下面程序的执行结果是什么?
为什么?
classSample
{
public:
intx;
inty;
voiddisp(){cout<};
voidmain()
{
intSample:
:
*pc;
Samples;
pc=&Sample:
:
x;
s.*pc=10;
pc=&Sample:
:
y;
s.*pc=20;
s.disp();
}
答:
本程序执行的结果是x=10,y=20。
原因是在main()中定义的pc是一个指向Sample类数据成员的指针。
执行pc=&Sample:
:
x时,pc指向数据成员x,
语句s.*pc=10等价于s.x=10(为了保证该语句正确执行,Sample类中的x必须是公共成员);
执行pc=&Sample:
:
y时,pc指向数据成员y,语句s.*pc=20等价于s.y=20(同样,Sample类中的y必须是公共成员)。
所以输出为:
x=10,y=20。
4.下面程序的执行结果是什么?
为什么?
classbase
{
public:
base(){fc();};
virtualvoidfc(){cout<<"Inclassbase"<virtual~base()=0{cout<<"Destructingbaseobject"<};
classA:
publicbase
{
public:
A(){fc();};
voidf(){fc();};
~A(){fd();};
voidfd(){};
};
classB:
publicA
{
public:
B(){};
voidfc(){cout<<"InclassB"<~B(){fd();}
voidfd(){cout<<"DestructingBobject"<};
voidmain()
{
Bb;
b.fc();
base*p=newA;
p->fc();
deletep;
}
答:
因为构造函数先调用基类,然后子类。
而析构先调用子类,然后基类,所以输出:
Bb;输出Inclassbase(先调用基类构造函数),然后输出Inclassbase(派生类A的构造函数),而B的构造函数没有额外输出。
b.fc();输出InclassB
base*p=newA;输出Inclassbase(先调用基类构造函数),然后输出Inclassbase(派生类A的构造函数)
p->fc();输出Inclassbase(派生类的输出),因子类A没有覆盖基类的fc()
deletep;因A析构没有做事,输出Destructingbaseobject(基类的析构函数)
程序结束:
输出DestructingBobject,然后输出Destructingbaseobject
三)、根据要求编写完整的程序:
(每题15分,共30分)
1.编写一个程序,设计一个base基类,它有两个私有数据成员x和y以及一个虚函数add(),由它派生出two类和three类,后者添加一个私有数据成员z,在这些派生类中实现add成员函数,并用数据进行测试。
答:
设计的程序如下:
classbase
{private:
floatx;
floaty;
public:
virtualfloatAdd(float,float);
};
classtwo:
publicbase
{
public:
floatAdd(floatx,floaty)
{returnx+y;}
};
classthree:
publicbase
{
private:
float z;
public:
floatAdd(floatx,floaty)
{
returnx+y;
}
};
intmain()
{
towm;
base*wo=&m;
floatvalue=wo.Add(5.3,9.5);
cout<threem1;
wo=&m1;
floatvalue=wo.Add(5.3,9.5);
cout<}
2.编写一个程序,设计一个点类Point,并由此派生出一个圆类。
并用数据进行测试,计算圆的面积和周长。
答:
程序如下:
#definePAI3.1415926
classpoint
{public:
virtualfloatair(floatR){}
virtualfloatlang(floatR){}
};
classyuan:
publicpoint
{
public:
floatair(floatR)
{
returnPAI*R*R;
}
floatlang(floatR)
{
returnPAI*2*R
}
}