(预习报告)
- 实验目的
- 学习并了解运算符重载的使用方法。
- 掌握纯虚函数和抽象类的特征,会用虚函数实现运行时的多态性来编写程序。
- 掌握虚函数的定义和特征
- 实验内容
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++语言中,基类将两种成员函数区别开来:一种是基类希望派生类覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类将其定义为虚函数。整体上这部分的知识还是有一定的难度的,尤其是在于理解后的编程上不能得心应手,调试过程遇到的问题也比较多,幸好逐一解决了,这部分的知识还需要多复习。