c++学习:运算符重载编写字符串类实战

目录

先定义一个类

定义构造和析构函数

用out<<

用s1.clear();清空数组

用s1.size();返回字符个数

加入扩容数组函数

用s2.append("world");和s1 += "nihao";追加数组数据

用if(s1 == s2)比较两个对象的数组

用if(s1 == "123456")比较对象的数组和字符串

用if(s1.compare(s2) == 0)和s1.compare("123456")比较两个的数组

用if(s1.find("123456")!=NULL)查找对象的数组中是否有字符串

思考s7 = s6;会发生什么

思考MString s9 = s8;会发生什么


先定义一个类

//char类型的数组类
class MString
{
public:MString(){}~MString(){}
private:char *m_str;int m_size;
};

定义构造和析构函数

如果我想用不同的方法创建类的对象:例如

MString s0;
MString s1(10); //10代表的是数组的元素的个数
MString s2("hello"); //创建一个数据为hello的数组
MString s3('c',20);// 字符c 连续拷贝20个数组  cccccccccccccccccc

代码

public:MString(int size = 1024) // MString s0;  MString s1(10);{this->m_size = size;this->m_str = new char[this->m_size];memset(this->m_str,0,this->m_size);}MString(const char*str) // MString s2("hello");{//数组是一个动态数组 ,按需分配this->m_size = strlen(str) + 1;this->m_str = new char[this->m_size];strcpy(this->m_str,str);}MString(char ch,int length) // MString s3('c',20);{//数组是一个动态数组 ,按需分配this->m_size = length + 1;this->m_str = new char[this->m_size];for(int i=0; i<length; i++){m_str[i] = ch;}}~MString(){//释放堆的内容delete []this->m_str;}

用out<<s3<<endl;直接输出数组

ostream& operator<<(ostream &out,MString &ra)
{out<<ra.m_str;return out;
}在类中定义友元函数
friend ostream& operator<<(ostream &out,MString &ra);

用s1.clear();清空数组

public:void clear(){memset(this->m_str,0,this->m_size);}

用s1.size();返回字符个数

public:int size(){return m_size;}

加入扩容数组函数

public://扩容void setSize(int size){if(m_size >= size)return ;//1、先保存原来的空间的数据char temp[this->m_size];memset(temp,0,this->m_size);strcpy(temp,m_str);//2、释放原来的空间delete []this->m_str;//3、申请更大的堆空间this->m_str = new char[size];this->m_size = size;memset(m_str,0,this->m_size);//4、重新把数据赋值回去strcpy(m_str,temp);}

用s2.append("world");和s1 += "nihao";追加数组数据

public:void append(const char*str){//如果原来的空间不够。那么必须扩容if(strlen(m_str)+strlen(str)+1 > this->m_size){//1、先保存原来的空间的数据char temp[this->m_size];memset(temp,0,this->m_size);strcpy(temp,m_str);//2、释放原来的空间delete []this->m_str;//3、申请更大的堆空间this->m_size = strlen(m_str)+strlen(str)+1;this->m_str = new char[m_size];memset(m_str,0,this->m_size);//4、重新把数据赋值回去strcpy(m_str,temp);}sprintf(this->m_str,"%s%s",this->m_str,str);}void operator+=(const char*str){append(str);}

用if(s1 == s2)比较两个对象的数组

public:int operator==(MString &ra){return !strcmp(this->m_str,ra.m_str);}

用if(s1 == "123456")比较对象的数组和字符串

public:int operator==(const char*str){return !strcmp(this->m_str,str);}

用if(s1.compare(s2) == 0)和s1.compare("123456")比较两个的数组

public:int compare(const char*str) //compare  如果相同 返回 0   不同 非0{return strcmp(this->m_str,str);}int compare(MString &ra){return strcmp(this->m_str,ra.m_str);}

用if(s1.find("123456")!=NULL)查找对象的数组中是否有字符串

public:char* find(const char*str){return strstr(this->m_str,str);}

思考s7 = s6;会发生什么

s7 = s6; ------编译器在编译的时候 会自动转换成 运算符函数调用 s7.operator=(s6)
如果类中有 指针成员 指向堆空间,最好自定义赋值运算符函数public://如果没有自定义赋值运算符函数,那么此时编译器会自动给你生成默认的赋值函数void operator=(MString &ra) //MString &ra = s6{cout<<"void operator=(MString &ra)"<<endl;this->m_str = ra.m_str;this->m_size = ra.m_size;}//编译器默认生成的赋值函数  可能会造成内存泄漏//---------------------------------------------------------------------//这个可以防止内存泄漏void operator=(MString &ra) //MString &ra = s6{strcpy(this->m_str,ra.m_str);this->m_size = ra.m_size;}

思考MString s9 = s8;会发生什么

  • 在定义一个类对象的时候,通过另外一个对象来初始化,调用拷贝构造函数

  • MString s9 = s8;------->MString s9(s8);

    public:MString(const MString& other) {// 实现复制构造函数的代码}

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

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

相关文章

Windows搭建RTSP视频流服务(EasyDarWin服务器版)

文章目录 引言1、安装FFmpeg2、安装EasyDarWin3、实现本地\虚拟摄像头推流服务4、使用VLC或PotPlayer可视化播放器播放视频5、RTSP / RTMP系列文章 引言 RTSP和RTMP视频流的区别 RTSP &#xff08;Real-Time Streaming Protocol&#xff09;实时流媒体协议。 RTSP定义流格式&am…

[BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务

1.问题描述 使用yarn调度任务时&#xff0c;在CapacityScheduler页面上单击叶队列&#xff08;或子队列&#xff09;时&#xff0c;不会显示应用程序任务信息&#xff0c;root队列可以显示任务。此外&#xff0c;FairScheduler页面是正常的。 No matching records found2.原…

字符串序列判定(100%用例)C卷 (JavaPythonNode.jsC语言C++)

输入两个字符串 S 和 L ,都只包含英文小写字母。 S 长度 <=100 , L 长度 <=500,000 。判定 S 是否是 L 的有效字串。 判定规则: S 中的每个字符在 L 中都能找到(可以不连续),且 S 在L中字符的前后顺序与 S 中顺序要保持一致。(例如, S="ace" 是 L=&q…

Unity之地形的构建

PS&#xff1a;公司没活干&#xff0c;好无聊偷偷摸鱼学Unity&#xff0c;害怕自己学完之后忘记&#xff0c;写下这一篇博客 先来看一下效果图&#xff1a;有山有水有树有草地 创建一个新的Unity3D项目 这里要用到Unity官方的免费资源包&#xff08;现在好像已经下架了百度网盘…

elementui+vue2 input输入框限制只能输入数字

方法1 自定义表单校验 <el-form :model"Formdata" ref"formRef" :rules"nodeFormRules" label-width"100px"><el-form-itemlabel"年龄"prop"age"><el-input v-model.number"Formdata.age&q…

excel 函数技巧

1&#xff1a;模糊查询 LOOKUP(1,0/FIND(F1062,Sheet1!C$2:Sheet1!C$9135),Sheet1!B$2:Sheet1!B$9135) 函数含义&#xff1a;寻找F列1062行和sheet1中的C2行到C9135行进行模糊查询&#xff0c;返回该行对应的B2行到B9135行的结果。未查到返回结果0 函数公式&#xff1a; LO…

SQL高级:递归查询

如果在单表或两表中存储了树形结构数据,那么在查询这些数据时,就有可能要用到递归查询。 在实际的业务场景中,树形结构的数据很常见。比如组织架构、产品材料清单、产品大类和小类等等。 递归查询也是一个很有趣的知识点。我们来学习一下它。 辅助表 为了学习这个知识点…

thinkphp命令执行漏洞(CVE-2018-1002015)

漏洞描述&#xff1a; ThinkPHP 5.0.x版本和5.1.x版本中存在远程代码执行漏洞&#xff0c;该漏洞源于ThinkPHP在获取控制器名时未对用户提交的参数进行严格的过滤。远程攻击者可通过输入‘&#xff3c;’字符的方式调用任意方法利用该漏洞执行代码。 复现过程&#xff1a; 1…

学习Java第80天,基于IDEA 进行Maven依赖管理

1. 依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…

Excel formulas 使用总结(更新中)

最近在写task assigment的时候学习到的&#xff0c;记录下。 首先它所有需要写赋值formuls都要用 开头 相等赋值 a1 这个就代表这格的数据和a1是一样的。如果希望其他格和它相同的逻辑&#xff0c;可以直接复制该cell或者直接拖动该cell右下角&#xff0c;他会自动进行匹配…

小米SU7汽车发布会; 齐碳科技C+轮融资;网易 1 月 3 日发布子曰教育大模型;百度文心一言用户数已突破 1 亿

投融资 • 3200 家 VC 投资的创业公司破产&#xff0c;那个投 PLG 的 VC 宣布暂停投资了• 云天励飞参与 AI 技术与解决方案提供商智慧互通 Pre-IPO 轮融资• 百度投资 AIGC 公司必优科技• MicroLED量测公司点莘技术获数千万级融资• 智慧互通获AI上市公司云天励飞Pre-IPO轮战…

ajax的完整写法——success/error/complete+then/catch/done+设置请求头两种方法——基础积累

ajax的完整写法——success/error/completethen/catch/done设置请求头两种方法——基础积累 1.完整写法——success/error/complete1.1 GET/DELETE——query传参1.2 GET/DELETE——JSON对象传参1.3 PUT/POST——JSON对象传参 2.简化写法——then/catch/done2.1 GET/DELETE——q…

[spark] dataframe的数据导入Mysql5.6

在 Spark 项目中使用 Scala 连接 MySQL 5.6 并将 DataFrame 中的数据保存到 MySQL 中的步骤如下&#xff1a; 添加 MySQL 连接驱动依赖&#xff1a; 在 Spark 项目中&#xff0c;你需要在项目的构建工具中添加 MySQL 连接驱动的依赖。 如果使用 Maven&#xff0c;可以在 pom.xm…

【Spark精讲】一文讲透Spark宽窄依赖的区别

宽依赖窄依赖的区别 窄依赖&#xff1a;RDD 之间分区是一一对应的宽依赖&#xff1a;发生shuffle&#xff0c;多对多的关系 宽依赖是子RDD的一个分区依赖了父RDD的多个分区父RDD的一个分区的数据&#xff0c;分别流入到子RDD的不同分区特例&#xff1a;cartesian算子对应的Car…

【javaweb】tomcat9.0中的HttpServlet

2023年12月28日&#xff0c;周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中&#xff0c;HttpServlet 是 Java Servlet API 中的一个抽象类&#xff0c;用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…

Make 起步

文章目录 构建的定义Make 是什么Make 使用Makefile 文件规则Makefile 语法 构建的定义 代码变成可执行文件&#xff0c;叫做编译&#xff08;compile&#xff09;先编译这个文件&#xff0c;然后编译那个文件&#xff08;即编译的安排&#xff09;&#xff0c;叫做构建&#x…

项目引入本地jar包后,maven无法打包

目录 一、场景二、解决 一、场景 1、项目引入本地jar包 2、引入本地jar包后项目编译正常 3、maven打包时报错 二、解决 在pom.xml的plugins添加以下配置 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&…

Ubuntu Desktop 22.04 桌面主题配置

Ubuntu Desktop 22.04 桌面主题配置 使用这么久 Ubuntu Desktop&#xff0c;本着不折腾的原则&#xff0c;简单介绍下自己的桌面主题配置。 安装 tweaks 安装 GNOME Shell 安装 GNOME theme安装 gnome-tweaks & chrome-gnome-shell sudo apt update # 安装 gnome-tweaks…

数据清洗与融合期末考试(常见理论题)

题库来源未知&#xff0c;大家有的话&#xff0c;也可以发给我&#xff0c;继续补充&#xff0c;答案不一定全部得分&#xff0c;但有借鉴价值 题库会不断扩充&#xff0c;答案会不断完善。 近几年的新冠疫情中&#xff0c;大数据发挥了重要的作用&#xff0c;通过大数据进行数…

android 手机主界面侧滑退出app问题

最近重新搭了个app&#xff0c;发现手机显示APP主界面时&#xff0c;沿着手机右边向左滑&#xff0c;会直接关闭应用&#xff0c;所以想搞个第一次提示&#xff0c;第二次退出app的效果。 结果搞出个复杂的东西&#xff0c;下面是两段代码。1: 1:GestureDetector扩展函数。其…