运算符重载和虚函数

(预习报告)

  • 实验目的
  1. 学习并了解运算符重载的使用方法。
  2. 掌握纯虚函数和抽象类的特征,会用虚函数实现运行时的多态性来编写程序。
  3. 掌握虚函数的定义和特征
  • 实验内容

1.对于类MyString,要求重载‘+’运算符后可以计算表达式:a=b+c;表示两个字符串连接。其中a,b,c都是类MyString的对象。

2.使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。由Circle类派生Sphere类和Column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。

  • 算法描述及流程图

运算符重载实际上是函数重载,将运算符重載为成员函数时,必须保证调用该运算符的第一个操作数为该类的一个对象,否则将出错;将运算符重载为友元西数时,不必要求调用该运算符的操作数为类的对象;重载为成员函数时,一般为一个参数,常将单目运算符重载为成员函数;而重载为友元函数时一般为两个参数,常将双目运算符重载为友元函数。

友元函数

成员函数

单目运算符

1个参数

0个参数

双目运算符

2个参数

1个参数

(实验报告)

  • 程序清单

实验1:

#define _CRT_SECURE_NO_WARNINGS 1

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>

#include<string.h>

using namespace std;

class Mystring {

public:

Mystring(const char* ptr = "")

:_ptr(new char[strlen(ptr) + 1])

{

strcpy(_ptr, ptr);

}

Mystring operator+(Mystring& s) {

int len1 = strlen(_ptr);

int len2 = strlen(s._ptr);

char* tmp = new char[len1 + len2 + 1];

strcpy(tmp, _ptr);

strcpy(tmp + len1, s._ptr);

Mystring ret(tmp);

delete[] tmp;

return ret;

}

friend ostream& operator<<(ostream& _cout, Mystring& s);

private:

char* _ptr;

};

ostream& operator<<(ostream& _cout, Mystring& s) {

_cout << s._ptr;

return _cout;

}

int main() {

Mystring a("甲乙丙丁,");

Mystring b("子丑寅卯");

Mystring c;

c = a + b;

cout << c << endl;

return 0;

}

实验2:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

#include<math.h>

using namespace std;

double PI = acos(-1);

//圆,接口类

class Circle {

public:

virtual double area() = 0;//表面积

virtual double volume() = 0; //体积

protected:

double _r;//半径

};

//球

class Sphere :public Circle {

public:

Sphere(double r = 0.0) {

_r = r;

}

//表面积

virtual double area() {

return 4 * PI * _r * _r;

}

//体积

virtual double volume() {

return 4.0 / 3 * PI * _r * _r * _r;

}

};

//圆柱

class Column :public Circle {

public:

Column(double r = 0, double h = 0) {

_r = r;

_h = h;

}

//表面积

virtual double area() {

return 2 * (PI * _r * _r) + (PI * 2 * _r * _h);

}

//体积

virtual double volume() {

return PI * _r * _r * _h;

}

private:

//高

double _h;

};

int main() {

double rS, rC, h;

cout << "请输入球体的半径:";

cin >> rS;

cout << "请输入圆柱体的半径:";

cin >> rC;

cout << "请输入圆柱体的高:";

cin >> h;

cout << endl;

Sphere sphere(rS);

Column column(rC, h);

cout << "球体的半径为:" << rS << endl;

cout << "球体的表面积为:" << sphere.area() << endl;

cout << "球体的体积为:" << sphere.volume() << endl << endl;

cout << "圆柱体的半径为:" << rC << endl;

cout << "圆柱体的表面积为:" << column.area() << endl;

cout << "圆柱体的体积为:" << column.volume() << endl << endl;

return 0;

}

  • 调试过程

在定义Π的值时,由于大意直接写的double PI = cos(-1);导致程序正常输出但是结果却是错误的,在调试时改为double PI = acos(-1);求反余弦得到了Π的正确值。

在使用函数之前,一定要把头文件写全,实验1在调试的过程中出错的原因就是因为缺少头文件。

  • 实验结果

  • 小结

重载的运算符具有特殊的名字,由关键字和其后要定义的运算符共同组成。和其他函数一样,重载的运算符也包含返回类型,参数表以及函数体。在C++语言中,基类将两种成员函数区别开来:一种是基类希望派生类覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类将其定义为虚函数。整体上这部分的知识还是有一定的难度的,尤其是在于理解后的编程上不能得心应手,调试过程遇到的问题也比较多,幸好逐一解决了,这部分的知识还需要多复习。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
定义表示形状的抽象类及相应的派生类,并实现相关操作符重载。 (1)定义表示形状的抽象类Shape: 添加公有成员函数double Area(),用于计算形状面积;定义为纯函数; 添加公有成员函数void Show(),用于显示形状信息,定义为纯函数; 定义的析构函数重载比较操作符:==、>和<,用于比较两个形状面积的大小关系,返回值类型为bool,可以定义为成员函数或友元函数。 (2)从形状类Shape派生矩形类Rectangle: 添加double型的保护数据成员:rectWidth和rectHeight,分别表示矩形的宽度和高度; 定义带参构造函数; 重定义公有成员函数Show,打印矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”; 重定义公有成员函数Area,计算矩形面积。 (3)从形状类Shape派生椭圆类Ellipse: 添加double型的保护数据成员:rectWidth和rectHeight,分别表示椭圆外接矩形的宽度和高度; 定义带参构造函数; 重定义公有成员函数Show,打印椭圆外接矩形的宽度和高度,输出格式为“W: 宽度; H: 高度; Area: 面积”; 重定义公有成员函数Area,计算椭圆面积。 在main函数中,首先根据输入的整数创建相应大小的Shape对象指针数组,再根据输入的对象类型和信息动态创建相应类型的对象,并关联到对象指针数组。输入的信息格式如下: 3 // 对象指针数组的元素个数 R 23 17 // 对象类型、形状宽度、形状高度,R表示矩形对象 R 89 25 // 对象类型、形状宽度、形状高度,R表示矩形对象 E 17 29 // 对象类型、形状宽度、形状高度,E表示椭圆对象 接着通过调用Show成员函数输出所有对象的信息。 然后输出面积相等的形状对象的信息(要求使用重载运算符“==”来判断对象的面积是否相等),输出格式如下: Area of Shape[i] is equal to Shape[j] 最后将所有形状对象按面积从大到小排序(要求使用重载运算符“>”来判断对象的面积的大小关系),并输出排序后的对象信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值