内容提要

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

运算符重载:

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#define N 32using 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.1415using 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";}elsebreak;}while (true){cout << "请输入圆柱体的半径:";cin >> rC;if (rC <= 0){cout << "请输入大于0的数据!\n\n";}elsebreak;}while (true){cout << "请输入圆柱体的高:";cin >> h;if (h <= 0){cout << "请输入大于0的数据!\n\n";}elsebreak;}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;
}

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

  1. C++实验五 运算符重载

    为实验二中编写的Songer(歌手)类重载"+".">"."==".前置"++".后置"++" ...

  2. C++运算符重载(友元函数方式)

    我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数. 当重载友元函数时,将没有隐含的参数this指针.这样,对双目运算符,友元函 ...

  3. 运算符重载的非成员函数形式

    运算符重载为非成员函数的规则: 函数的形参代表依自左至右次序排列的各操作数 重载为非成员函数时 参数个数 = 原操作数个数(后置++.--除外,它们仍然为了区分前置++.--要强行加个int) 至少应 ...

  4. (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则

    文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...

  5. 【C++实验】运算符重载(两个矩阵相加)

    运算符重载 运算符重载概念 对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,从而适用于用户自定义类型的数据(比如复数.矩阵等)之间的运算 运算符重载方法 定义一个重载运算符函数,在需要时系 ...

  6. 【C++】C++类的学习(三)——运算符重载与友元函数

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前面的两篇博文中介绍了类的一些基本特性,今天讲一讲运算符重载和友元. 运算符重载 运算 ...

  7. 坚持学习100天:多态(函数重载、虚函数和多态)

    前言 Hello,我是修齊. 学习C++的第一百零一十天,将近五一假期了,不浪漫亦是罪名,男生今年不能再挨批斗了,放假就得好好陪陪身边的人浪漫浪漫,生活,加油,学习加油. 在这里记录一些学习的东西和学 ...

  8. C++ 运算符重载和类型转换函数

    C++中对于用户自定义类对象的运算,要进行重载操作.如 class overload{public:... private:int num; }; overload o1, o2; int num; ...

  9. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

最新文章

  1. Ngnix负载均衡安装及配置
  2. 计算机语言pandas,计算机语言python100道pandas(含答案)
  3. python元组和列表教程_Python列表和元组
  4. 视口和窗口的理解方法
  5. 剥开比原看代码(八):比原的Dashboard是怎么做出来的?
  6. linux 编译运行c文件
  7. Linux设置封包报头的函数,GitHub - LinuxDigger/RTMP
  8. 移动设备安全隐患分析
  9. JavaScript核心语法学习部分(七)
  10. aspx转为html5,保存ASPX 生成的html代码
  11. LabVIEW基于机器视觉的实验室设备管理系统(1)
  12. 如何将腾讯视频客户端下载的QLV视频格式转换成MP4格式
  13. ffmpeg 10bit 8bit yuv格式转换
  14. 笔记本链接不上wifi怎么办
  15. st公司stm32MCU,cubemx创建工程,Drivers文件夹下内容不可见问题的描述与粗略解决方法
  16. Python+uiautomator2手机UI自动化测试实战
  17. 凭什么让你“转贴”?
  18. pip install mpi4py报错:ERROR: Could not build wheels for mpi4py, which is required to install pyprojec
  19. 【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(二)
  20. Unity3D优化技巧系列七

热门文章

  1. Final Cut Pro X 苹果视频剪辑软件
  2. 优柔寡断的人必读忠告
  3. 路由器EMC检测办理需要哪些资料
  4. perf使用实例详解
  5. 自由人NFT:你为什么抢不到NFT数字藏品?
  6. 使用urllib 爬取万条伤感网易云热评
  7. 彻底解决Fedora 6 中的添加删除与升级(转自网上)
  8. 04 | Keil和ISIS的实际应用(二)
  9. LINUX第十一堂课笔记
  10. 英特尔陈小波: 克服瓶颈,加速你的混合云