【C++---06】实验报告: 运算符重载和虚函数

    xiaoxiao2025-03-28  19

     

    内容提要

    对于类MyString,要求重载‘+’运算符后可以计算表达式:a=b+c;表示两个字符串连接。其中a,b,c都是类MyString的对象。使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。由Circle类派生Sphere类和Column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。基本要求重载相应的运算符并编写程序,能运用虚函数编写程序测试并提交程序。

     

    运算符重载:

    #pragma warning(disable:4996) #include <iostream> #include <cstring> #define N 32 using namespace std; class MyString { char *data; int len; public: MyString() { data = new char[N]; len = 0; } MyString(const char* a); MyString& operator + (MyString & a); MyString& operator + (char * a); MyString& operator + (const char *a); MyString& operator = (MyString & a); MyString& operator = (char * a); MyString& operator = (const char *a); int strLen(void) { return len; } char * Data(void) { return data; } friend ostream & operator << (ostream &os, MyString &a); //friend istream & operator >> (istream &is, MyString &a); }; MyString::MyString(const char *a) { data = new char[strlen(a) + 1]; strcpy(data, a); len = strlen(a); } MyString& MyString::operator + (MyString & a) { if (len + a.strLen() > (N - 1)) { //分配一段新的控件并将两个字符串拼接起来 char *tmp = new char[len + a.strLen() + 1]; strcpy(tmp, data); strcat(tmp, a.Data()); data = tmp; } else { strcat(data, a.Data()); } len += a.strLen(); return *this; } MyString& MyString::operator + (char * a) { if (len + strlen(a) > (N - 1)) { char *tmp = new char[len + strlen(a) + 1]; strcpy(tmp, data); strcat(tmp, a); data = tmp; } else { strcat(data, a); } len += strlen(a); return *this; } MyString& MyString::operator + (const char *a) { if (len + strlen(a) > (N - 1)) { char *tmp = new char[len + strlen(a) + 1]; strcpy(tmp, data); strcat(tmp, a); data = tmp; } else { strcat(data, a); } len += strlen(a); return *this; } MyString& MyString::operator = (MyString & a) { if (&a != this && len > 0 && len < a.strLen()) { delete[] data; data = new char[a.strLen() + 1]; } strcpy(data, a.Data()); len = a.strLen(); return *this; } MyString& MyString::operator = (char * a) { if (data != nullptr && len < strlen(a)) { delete[] data; data = new char[strlen(a) + 1]; } strcpy(data, a); len = strlen(a); return *this; } MyString& MyString::operator = (const char *a) { if (data != nullptr && len < strlen(a)) { delete[] data; data = new char[strlen(a) + 1]; } strcpy(data, a); len = strlen(a); return *this; } ostream & operator << (ostream &os, MyString &a) { os << a.Data(); return os; } int main(void) { MyString str("清风朗月 "); str = str + "辙思玄度"; cout << str << endl; str = str + ".我与春风皆过客,谁共明月赴长生."; cout << str << endl; str = "你只见草木皆兵,我却看浩瀚苍穹"; cout << str << endl; char tmp[] = "星河滚烫,你是人间理想;"; str = tmp; cout << str << endl; system("pause"); return 0; }

    虚函数的代码:

    #include <iostream> #define PIE 3.1415 using namespace std; //圆,接口类 class Circle { protected: double radius; public: //表面积 virtual double area(void) = 0; //体积 virtual double volume(void) = 0; }; //球 class Sphere :public Circle { public: Sphere(double r = 0) { radius = r; } //表面积 virtual double area(void) { return 4.0 * PIE * radius * radius; } //体积 virtual double volume(void) { return (4.0 / 3.0) * PIE * radius * radius * radius; } }; //圆柱 class Column :public Circle { private: double height; public: Column(double r = 0, double h = 0) { radius = r; height = h; } //表面积 virtual double area(void) { if (0 == height) { //底面积 return PIE * radius * radius; } return 2.0* PIE * radius * radius + PIE * 2.0 * radius * height; } //体积 virtual double volume(void) { if (0 == height) { return 0; } return PIE * radius * radius * height; } }; int main(void) { double rS, rC, h; while (true) { cout << "请输入球体的半径:"; cin >> rS; if (rS <= 0) { cout << "请输入大于0的数据!\n\n"; } else break; } while (true) { cout << "请输入圆柱体的半径:"; cin >> rC; if (rC <= 0) { cout << "请输入大于0的数据!\n\n"; } else break; } while (true) { cout << "请输入圆柱体的高:"; cin >> h; if (h <= 0) { cout << "请输入大于0的数据!\n\n"; } else break; } Sphere sphere(rS); Column column(rC, h); cout << "球体的半径为:" << rS << endl << "球体的表面积为:" << sphere.area() << endl << "球体的体积为:" << sphere.volume() << endl << endl; cout << "圆柱体的半径为:" << rC << endl << "圆柱体的表面积为:" << column.area() << endl << "圆柱体的体积为:" << column.volume() << endl << endl; system("pause"); return 0; }

     

    最新回复(0)