郑州大学《面向对象程序设计》课程作业doc.docx
- 文档编号:9904062
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:10
- 大小:23.73KB
郑州大学《面向对象程序设计》课程作业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 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 郑州大学 面向 对象 程序设计 课程 作业 doc
![提示](https://static.bdocx.com/images/bang_tan.gif)