C++(5)

1.运算符重载

头文件

#ifndef MYSTRING_H
#define MYSTRING_H#include <iostream>
#include <cstring>using namespace std;class myString
{
private:char *str;//C风格字符串int size=0;
public:std::string s_str;//转换构造函数myString(const std::string &s);//无参构造myString();//有参构造//string s("hello world")myString(const char *s);//有参构造//string s(5,'A');myString(int n, const char s);//析构函数~ myString();//拷贝构造函数myString(const myString &other);//拷贝赋值函数myString &operator=(const myString &other);//判空函数//返回1表示空,返回0表示非空bool empty();//size函数int str_size();//c_str函数const char* c_str() const;//at函数char &at(int index);//二倍扩容void expand();//+运算符重载const myString operator+(const myString &R) const;//+运算符重载const myString operator+(const char &R);//+=运算符重载myString & operator+=(const myString &R);//&(取地址)运算符重载const myString * operator&() const;//[]运算符重载char & operator[](const int index);//==运算符重载bool operator==(const myString &R);//!=运算符重载bool operator!=(const myString &R);//<运算符重载bool operator<(const myString &R);//>运算符重载bool operator>(const myString &R);//<=运算符重载bool operator<=(const myString &R);//>=运算符重载bool operator>=(const myString &R);//将<<重载函数设为友元friend ostream & operator<<(ostream &L, const myString &R);//将>>重载函数设为友元friend istream & operator<<(istream &L, const myString &R);//将getline重载函数设为友元friend istream & getline(istream &L, myString &R);
};#endif // MYSTRING_H

源文件

#include "mystring.h"//函数定义
//转换构造函数
myString::myString(const std::string &s):s_str(s)
{cout<<"转换构造"<<endl;
}
//无参构造
myString::myString():size(10)
{str = new char[size];memset(str,'\0',10);cout<<"无参构造"<<endl;
}
//有参构造
//string s("hello world")
myString::myString(const char *s):size(strlen(s)+1)
{str = new char[size];strcpy(str,s);cout<<"有参构造"<<endl;
}
//有参构造
//string s(5,'A');
myString::myString(int n, const char s):size(n+1)
{str = new char[size];memset(str,s,n);str[n] = '\0';cout<<"有参构造"<<endl;
}
//析构函数
myString::~ myString()
{delete []str;cout<<"析构成功"<<endl;
}
//拷贝构造函数
myString::myString(const myString &other):size(other.size)
{str = new char[size];memcpy(str,other.str,size);cout<<"拷贝构造完成"<<endl;
}
//判空函数
//返回1表示空,返回0表示非空
bool myString::empty()
{if(size==0||str[0]=='\0'){cout<<"该字符串为空"<<endl;return 1;}cout<<"该字符串非空"<<endl;return 0;
}
//size函数
int myString::str_size()
{cout<<"该字符串长度为"<<size<<endl;return size;
}
//c_str函数
const char* myString::c_str() const
{cout<<"该字符串为"<<str<<endl;return str;
}
//at函数
char &myString::at(int index)
{if(empty()||index<0||index>=size){cout<<"查找失败"<<endl;}cout<<"该字符串下标为"<<index<<"的字符为"<<str[index]<<endl;return str[index];
}
//二倍扩容
void myString::expand()
{if(empty()){cout<<"二倍扩容失败"<<endl;return ;}char *nstr = new char[2*size];memcpy(nstr,str,size);delete []str;str = nstr;size*=2;cout<<"二倍扩容成功"<<endl;
}
//拷贝赋值函数
//=运算符重载
myString & myString::operator=(const myString &other)
{if(&other!=this){delete []str;size = other.size;str = new char[size];strcpy(str,other.str);cout<<"=运算符重载"<<endl;}return *this;
}
//+运算符重载
const myString myString::operator+(const myString &R) const
{myString temp;temp.size = size+R.size-1;temp.str = new char[size];strcpy(temp.str,str);strcat(temp.str,R.str);cout<<"+运算符重载"<<endl;return temp;
}
//+运算符重载
const myString myString::operator+(const char &R)
{if(R=='\0'){cout<<"+运算符重载"<<endl;return *this;}else{str[size-1] = R;size++;str[size] = '\0';cout<<"+运算符重载"<<endl;return *this;}
}
//+=运算符重载
myString & myString::operator+=(const myString &R)
{int n_size = size+R.size-1;char *n_str = new char[n_size];strcpy(n_str,str);strcat(n_str,R.str);delete []str;str = n_str;size = n_size;cout<<"+=运算符重载"<<endl;return *this;
}
//&(取地址)运算符重载
const myString * myString::operator&() const
{cout<<"&运算符重载"<<endl;return this;
}
//[]运算符重载
char & myString::operator[](const int index)
{if(index>=0&&index<size){cout<<"该字符串下标为"<<index<<"的字符为"<<str[index]<<endl;cout<<"[]运算符重载"<<endl;return str[index];}throw out_of_range("索引越界,请更改索引!");
}
//==运算符重载
bool myString::operator==(const myString &R)
{if(strcmp(str,R.str)==0){cout<<"这两个字符串相等"<<endl;cout<<"==运算符重载"<<endl;return 1;}cout<<"这两个字符串不相等"<<endl;cout<<"==运算符重载"<<endl;return 0;
}
//!=运算符重载
bool myString::operator!=(const myString &R)
{if(strcmp(str,R.str)!=0){cout<<"这两个字符串不相等"<<endl;cout<<"==运算符重载"<<endl;return 1;}cout<<"这两个字符串相等"<<endl;cout<<"!=运算符重载"<<endl;return 0;
}
//<运算符重载
bool myString::operator<(const myString &R)
{if(strcmp(str,R.str)<0){cout<<str<<"小于"<<R.str<<endl;cout<<"<运算符重载"<<endl;return 1;}cout<<str<<"不小于"<<R.str<<endl;cout<<"<运算符重载"<<endl;return 0;
}
//>运算符重载
bool myString::operator>(const myString &R)
{if(strcmp(str,R.str)>0){cout<<str<<"大于"<<R.str<<endl;cout<<">运算符重载"<<endl;return 1;}cout<<str<<"不大于"<<R.str<<endl;cout<<">运算符重载"<<endl;return 0;
}
//<=运算符重载
bool myString::operator<=(const myString &R)
{if(strcmp(str,R.str)<=0){cout<<str<<"小于等于"<<R.str<<endl;cout<<"<=运算符重载"<<endl;return 1;}cout<<str<<"大于"<<R.str<<endl;cout<<"<=运算符重载"<<endl;return 0;
}
//>=运算符重载
bool myString::operator>=(const myString &R)
{if(strcmp(str,R.str)>=0){cout<<str<<"大于等于"<<R.str<<endl;cout<<">=运算符重载"<<endl;return 1;}cout<<str<<"小于"<<R.str<<endl;cout<<">=运算符重载"<<endl;return 0;
}
//<<运算符重载
ostream & operator<<(ostream &L, const myString &R)
{L<<R.str<<endl;cout<<"<<运算符重载"<<endl;return L;
}
//>>运算符重载
istream & operator<<(istream &L, const myString &R)
{L>>R.str;cout<<">>运算符重载"<<endl;return L;
}
//getline重载
istream & getline(istream &L, myString &R)
{std::string temp;std::getline(L, temp);R.s_str = temp;cout<<"getline重载"<<endl;return L;
}

主程序

#include "mystring.h"int main()
{myString str1;myString str2("Hello world!");str2[9];myString str3(10,'Z');myString str4 = str2;myString str5("You are a genius.");str4.operator!=(str2);str5.operator>(str3);str2.operator<=(str5);cout<<str5;myString s6;cout<<"请输入字符串:";getline(cin,s6);return 0;
}

2.思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S--配置存活、就绪和启动探针

目录 1 本人基础环境2 目的3 存活、就绪和启动探针介绍3.1 存活探针3.2 就绪探针3.3 启动探针 4 探针使用场景4.1 存活探针4.2 就绪探针4.3 启动探针 5 配置存活、就绪和启动探针5.1 定义存活探针5.2 定义一个存活态 HTTP 请求接口5.3 定义 TCP 的就绪探针、存活探测5.4 定义 g…

【HTML+CSS+JS+VUE】web前端教程-36-JavaScript简介

JavaScript介绍 JavaScript是一种轻量级的脚本语言&#xff0c;所谓脚本语言&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是用来编写控制其他大型应用程序的“脚本” JavaScript是一种嵌入式语言&#xff0c;它本身提供的核心语法不算很多 为什么学习JavaScri…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理

本文作者&#xff1a;AIGCmagic社区 猫先生 一、简 介 LLaVA-CoT引入了四个不同的阶段&#xff08;摘要、标题、推理和结论&#xff09;&#xff0c;使模型能够独立进行系统化的多阶段推理&#xff0c;显著提高了在推理密集型任务上的准确性。 编译了LLaVA-CoT-100k数据集&am…

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…

供应链数字化转型参考大型供应链系统技术架构设计方案

该文介绍了一个大型供应链系统技术架构的设计方案&#xff0c;包括整体设计、核心技术目录和应用案例。设计采用Choerodon微服务框架&#xff0c;关注海量并发、可伸缩性、安全性等方面。同时&#xff0c;方案符合大型企业结构的HR组织架构&#xff0c;支持多级组织架构和角色、…

STM32F1学习——DMA直接存储器存取

一、DMA直接存储器存取 DMA的全称是 Direct Memory Access 直接存储器存取&#xff0c;他可以提供外设和存储器间或存储器和存储器间的高速数据传输&#xff0c;无需CPU的干预。 STM32有12个DMA通道&#xff0c;由DMA1(7个通道组成)和DMA2(5个通道组成)&#xff0c;STM32F103C8…

一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取

大家好&#xff0c;今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana&#xff0c;旨在提供高效、灵活且功能丰富的网络爬取体验&#xff0c;适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…

6.2 MySQL时间和日期函数

以前我们就用过now()函数来获得系统时间&#xff0c;用datediff()函数来计算日期相差的天数。我们在计算工龄的时候&#xff0c;让两个日期相减。那么其中的这个now函数返回的就是当前的系统日期和时间。 1. 获取系统时间函数 now()函数&#xff0c;返回的这个日期和时间的格…

用 Python 处理 CSV 和 Excel 文件

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…

[云讷科技] 用于软件验证的仿真环境

我们使用Pursuit自动驾驶仪为各种场景设计仿真环境&#xff0c;以便用户可以在模拟环境中直接验证他们的软件&#xff0c;无需现场测试。该环境基于Gazebo引擎。 1. 工作区目录 模拟环境的工作区位于提供的U盘中的~/pursuit_space/sitl_space_pursuit中。用户可以按照用户手册…

【Uniapp-Vue3】页面生命周期onLoad和onReady

一、onLoad函数 onLoad在页面载入时触发&#xff0c;多用于页面跳转时进行参数传递。 我们在跳转的时候传递参数name和age: 接受参数&#xff1a; import {onLoad} from "dcloudio/uni-app"; onLoad((e)>{...}) 二、onReady函数 页面生命周期函数中的onReady其…

iOS 解决两个tableView.嵌套滚动手势冲突

我们有这样一个场景&#xff0c;就是页面上有一个大的tableView&#xff0c; 每一个cell都是和屏幕一样高的&#xff0c;然后cell中还有一个可以 tableView&#xff0c;比如直播间的情形&#xff0c;这个时候如果我们拖动 cell里面的tableView滚动的话&#xff0c;如果滚动到内…

STM32 FreeRTOS移植

目录 FreeRTOS源码结构介绍 获取源码 1、 官网下载 2、 Github下载 源码结构介绍 源码整体结构 FreeRTOS文件夹结构 Source文件夹结构如下 portable文件夹结构 RVDS文件夹 MemMang文件夹 FreeRTOS在基于寄存器项目中移植步骤 目录添加源码文件 工程添加源码文件 …

【ASP.NET学习】Web Forms创建Web应用

文章目录 什么是 Web Forms&#xff1f;ASP.NET Web Forms - HTML 页面用 ASP.NET 编写的 Hello RUNOOB.COM它是如何工作的&#xff1f;经典 ASP ASP.NET Web Forms - 服务器控件经典 ASP 的局限性ASP.NET - 服务器控件ASP.NET - HTML 服务器控件ASP.NET - Web 服务器控件ASP.N…

Linux 常见运营维护,从安装软件开始,到mysql,php,redis,tomcat等软件安装,配置,优化,持续更新中。。。

下载centos7 CentOS 7 完整版&#xff08;DVD&#xff09;&#xff1a; https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.isoCentOS 7 最小化版&#xff08;Minimal&#xff09;&#xff1a; https://mirrors.aliyun.com/centos/7/isos/x86_64/C…

用户界面软件05

已知应用 几乎所有的流行的用户界面架构都使用这种模式。我在这里举三个例子&#xff1a; 1. Seeheim 用户界面架构的特点是有一个应用核心的领域层和一个用户界面层。后者 被分为两层&#xff0c;叫做表示层和对话控制层。因为这个架构和面向事务系统有渊源&#xff0c;没有…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…