C++ 类的应用

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三、设计一个计算图形面积的类库。它的顶层是一个抽象类,并且提供了三个纯 虚函数:显示数据成员。返回面积、返回体积。 class Shape{
virtual void showDate()=0; virtual double reArea()=0; virtual double reVolume()=0; }; 第二层由 Shape 类派生 TwoDimShape(二维图形)、ThreeShape(三维图形)类、 他们增加了有关的数据成员,但没有成员函数的实现。第三层派生具体的图形类。 TwoDimShape 类派生 Circle、Ellipse、Rectangle、Triangle 等类。ThreeShape 类派 生 Ball、Cylinder(圆柱体)、RectangularParallelepiped(长方体)等类。 在主函数测试中使用多态方式调用不同对象的求值函数。 编码实现上述要求并回答以下问题 (1) 程序中如何体现多态性
二、建立一个建筑物类的层次体系。其中 building 包括保护数据成员 name(建 筑物名称)、floors(层数)和 areas(总面积),由 building 类派生住宅类 house 和办公楼类 office;住宅类 house 包括私有数据成员 rooms(房间数)和 balcony (阳台数);办公楼类 office 包括私有数据成员 office(s 办公室数)和 meetingrooms (会议室数)。住宅类 house 和办公楼类 office 都含有构选函数和 print 函数,以 分别用于对数据成员的初始化和输出。在主函数中,实例化 house 类和 office 类 对象并且将其数据输出。 编码实现上述要求并回答以下问题 (1) building 类中的成员 name、floors 和 areas 为什么定义为保护成员,可以定 义为私有成员吗? (2)通过你的程序输出说明类层次中构造函数的特点及执行次序。 (3)通过你的程序输出说明类层次中析构函数的特点及执行次序。 答:(1)building 类中的成员 name、floors 和 areas 不能定义为私有成员,因为 派生类 house 和 office 不能访问基类 building 的私有成员。 (2)程序输出的运行结果:
C+ቤተ መጻሕፍቲ ባይዱ考查题
关键词:友员函数 成员函数 抽象类 纯虚函数
一.建立一个复数类 imaginary,其私有数据成员 x 和 y 表示复数的实部和虚部, 构造函数 imaginary 用于对复数的实部和虚部初始化,成员函数 show 用于显示 复述对象,形式为“实部+虚部 i”;友员函数 add,sub,mul 和 div 分别用于进 行复数的加、减、乘和除法运算。在主函数中,实例化两个复数,并输入一个运 算符,按运算符选择相应的友员函数进行复数运算,然后调用成员函数 show 输 出计算结果。 编码实现上述要求并回答以下问题 (1) 四个友员函数的形参和返回值分别是什么? (2) 四个友员函数可以定义为相应的成员函数吗,写出原型 (3) 比较友员函数与成员函数的用法 答:(1)四个友员函数的形参是 f1,f2,函数返回值是 f
类层次中构造函数的特点及执行次序: 构造函数的特点是先构造基类,再构造派生类,如要构造派生类 house,则先构 造基类 building,再构造 house,要构造派生类 office,则先构造基类 building, 再构造 office。其执行次序是对象创建的顺序,如上述例子中对象创建的顺序是 先创建 house,再创建 office,故其执行次序是 construct Building,construct House, construct Building,construct Office。 (3)析构函数与构造函数相反,是先析构派生类再析构基类,其执行次序是对 象创建的逆顺序,即先析构 office,再析构 house。
Imaginary Imaginary:: operator *( Imaginary const& f2) {
Imaginary f; f.x=( x*f2.x) - (y*f2.y); f.y=( x*f2.y) + (f2.y*f2.x); return f; } Imaginary Imaginary:: operator /( Imaginary const& f2) { Imaginary f; f.x=(( x*f2.x)+( y*f2.y))/((f2.x*f2.x)+(f2.y*f2.y)); f.y=(( y*f2.x)-(x*f2.y))/((f2.x*f2.x)+(f2.y*f2.y)); return f; } (3)成员函数是一个类对外提供的接口,可以访问类的私有、保护成员变量。 友元函数就是要在类内声明,在声明前加 friend,它是一个不属于这个类的函 数,友元只是为这个函数访问某个类的私有成员变量提供了一种途径,下面就通 过一个例子来比较友员函数与成员函数的用法,如操作符+的重载,两个复数相 加的实现 f3=f1+f2; 普通操作符:f1+f2=operator+(f1,f2) 成员操作符:f1+f2=f1.operator+(f2)
如果把类 Shape 析构函数前的 virtual 去掉,则调用的是 Shape 对象的析构函 数而无法调用子类 Rectangle 的析构函数,即无法 delete Rectangle 的存储空 间,若要 delete,则必须把 delete rr 改成 delete (*Rectangle)rr,而事实上, 在运行时,你并不是总是能知道 p 所指对象的实际类型从而进行强制转换,所以, C++语言既然要支持多态,也就必须支持虚拟析构。
对象时,以该指针捆绑的释放空间操作,是针对不同类的析构函数的,如果不定 义为虚析构函数,则当基类指针指向不同的子类对象时,调用的是基类对象的析 构函数而无法调用子类的析构函数,下面举一个例子来说明:例如主程序中有语 句
Shape* rr=new Rectangle(0,0,2,2); rr->showDate(); delete rr;
(2)如果顶层类中的函数不定义为虚函数,则以 g(Rectangle(2,4,1,2))调用时, 形参 d 为 Rectangle 类对象,d.showDate()应该表示 Rectangle 的类操作,但结果 仍然是 Shape 的类操作,原因是同化效应。
(3)需要定义虚析构函数,虚析构函数在抽象类 Shape 中声明为 virtual~Shape(); 定义为 Shape::~Shape(){},作用是当基类指针指向不同的子类
(2) 如果顶层类中的函数不定义为虚函数,执行程序会什么结果,为什么?
(3) 是否需要定义了虚析构函数,虚析构函数有什么作用? 答:(1)一个操作随着所传递或捆绑的对象类型的不同能够作出不同的反应, 其行为模式称为多态。仅仅对于对象的指针和引用的间接访问,才会发生多态现 象。在 g 函数中,d 是 Shape 类的引用性形参,具体的图形类对象都可以作为实 参传给形参 d,如 Rectangle(2,4,1,2)可以作为实参传给 d,则调用 showDate()函数 来显示该 Rectangle 类对象的信息。
(2)四个友员函数可以定义为相应的成员函数,原型如下: 在 Imaginary 类内的函数声明: Imaginary operator +( Imaginary const& f2); Imaginary operator -( Imaginary const& f2); Imaginary operator *( Imaginary const& f2); Imaginary operator /( Imaginary const& f2); 在 Imaginary 类外的函数定义: Imaginary Imaginary ::operator +( Imaginary const& f2) { Imaginary f; f.x=x + f2.x; f.y=y + f2.y; return f; } Imaginary Imaginary:: operator -( Imaginary const& f2) { Imaginary f; f.x=x - f2.x; f.y=y - f2.y; return f; }
相关文档
最新文档