郑州大学《面向对象程序设计》课程作业doc.docx

上传人:b****7 文档编号:9423843 上传时间:2023-02-04 格式:DOCX 页数:10 大小:23.86KB
下载 相关 举报
郑州大学《面向对象程序设计》课程作业doc.docx_第1页
第1页 / 共10页
郑州大学《面向对象程序设计》课程作业doc.docx_第2页
第2页 / 共10页
郑州大学《面向对象程序设计》课程作业doc.docx_第3页
第3页 / 共10页
郑州大学《面向对象程序设计》课程作业doc.docx_第4页
第4页 / 共10页
郑州大学《面向对象程序设计》课程作业doc.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

郑州大学《面向对象程序设计》课程作业doc.docx

《郑州大学《面向对象程序设计》课程作业doc.docx》由会员分享,可在线阅读,更多相关《郑州大学《面向对象程序设计》课程作业doc.docx(10页珍藏版)》请在冰豆网上搜索。

郑州大学《面向对象程序设计》课程作业doc.docx

郑州大学《面向对象程序设计》课程作业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

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1