9.24作业

将昨天的My_string类中的所有能重载的运算符全部进行重载

+、[] 、>、<、==、>=、<=、!= 、+=(可以加等一个字符串,也可以加等一个字符)、输入输出(<< 、 >>)

代码如下

MyString.h

#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <cstring>using namespace std;class My_string
{
private:char *ptr;         //指向字符数组的指针int size;           //字符串的最大容量int len;            //字符串当前容量public://无参构造My_string();//有参构造My_string(const char* src);My_string(int num, char value);//拷贝构造My_string(const My_string &other);//拷贝赋值My_string & operator= (const My_string &other);//析构函数~My_string();//判空bool Isvoid();//显示void show();//尾插void push_back(char value);//尾删void pop_back();//at函数实现char &at(int index);//清空函数void clear();//返回C风格字符串char *data();//返回实际长度int get_length();//返回当前最大容量int get_size();//君子函数:二倍扩容bool Add();//自定义 + 运算符重载函数My_string operator+ (const My_string &R);//自定义 [] 运算符重载函数char& operator[] (int index);//自定义 >< == >= <=运算符重载函数bool operator> (My_string &R);bool operator< (My_string &R);bool operator== (My_string &R);bool operator== (My_string &&s);bool operator!= (My_string &R);bool operator>= (My_string &R);bool operator<= (My_string &R);//自定义 += 运算符重载函数My_string operator+= (const My_string &R);My_string operator+= (const My_string &&R);//友元friend ostream & operator<< (ostream &L,const My_string &R);friend istream & operator>> (istream &L,const My_string &R);};//定义全局函数 << >>运算符重载
ostream & operator<< (ostream &L,const My_string &R);
istream & operator>> (istream &L,const My_string &R);
#endif // MYSTRING_H

MyString.cpp

#include "MyString.h"My_string::My_string() : size(15), len(0) {ptr = new char[size];ptr[0] = '\0'; // 表示串为空串cout << "无参构造" << endl;
}My_string::My_string(const char* src) : size(15) {ptr = new char[size];strcpy(ptr, src); // 复制字符串len = strlen(src);
//    cout << "一个形参的有参构造" << endl;
}My_string::My_string(int num, char value) : size(15), len(num) {if (num > 15) {cout << "超出默认长度" << endl;return;}ptr = new char[size];for (int i = 0; i < num; i++) {ptr[i] = value;}ptr[num] = '\0'; // 确保字符串以'\0'结尾
//    cout << "部分形参的有参构造" << endl;
}My_string::My_string(const My_string &other) : size(other.size), len(other.len) {ptr = new char[size];strcpy(ptr, other.ptr); // 复制字符串cout << "拷贝构造" << endl;
}My_string& My_string::operator= (const My_string &other) {if (this != &other) {delete[] ptr; // 释放旧内存size = other.size;len = other.len;ptr = new char[size];strcpy(ptr, other.ptr); // 复制字符串}cout << "拷贝赋值" << endl;return *this;
}My_string::~My_string() {
//    cout << ptr << "析构函数" << endl;delete[] ptr;
}bool My_string::Isvoid() {return len == 0;
}void My_string::show() {cout << ptr << endl;
}void My_string::push_back(char value) {if (len < size - 1) {ptr[len++] = value;ptr[len] = '\0'; // 确保字符串以'\0'结尾} else if (Add()) {ptr[len++] = value;ptr[len] = '\0'; // 确保字符串以'\0'结尾}
}void My_string::pop_back() {if (len > 0) {len--;ptr[len] = '\0'; // 确保字符串以'\0'结尾}
}char& My_string::at(int index) {if (index < len) {return ptr[index];} else {cout << "下标越界" << endl;exit(EXIT_FAILURE);}
}void My_string::clear() {len = 0;ptr[0] = '\0'; // 确保字符串以'\0'结尾
}char* My_string::data() {return ptr;
}int My_string::get_length() {return len;
}int My_string::get_size() {return size;
}bool My_string::Add() {if (len == size - 1) {char *p = new char[size * 2];strcpy(p, ptr);delete[] ptr; // 释放旧内存ptr = p;size *= 2; // 更新容量return true;}return false;
}My_string My_string::operator+ (const My_string &R) const{My_string temp;temp.len = len + R.len;temp.size = size + R.size;temp.ptr = new char[temp.size];temp.ptr[0] = '\0';         // 确保以 '\0' 开头strcat(temp.ptr,this->ptr);strcat(temp.ptr,R.ptr);return temp;
}char& My_string::operator[] (int index){return this->ptr[index];
}bool My_string::operator> (My_string &R){return strcmp(this->ptr,R.ptr)>0 ? true:false;
}bool My_string::operator< (My_string &R){return strcmp(R.ptr,this->ptr)>0 ? true:false;
}
bool My_string::operator== (My_string &R){return strcmp(R.ptr,this->ptr)==0 ? true:false;
}
bool My_string::operator== (My_string &&R){return strcmp(R.ptr,this->ptr)==0 ? true:false;
}
bool My_string::operator!= (My_string &R){return strcmp(R.ptr,this->ptr)!=0 ? true:false;
}
bool My_string::operator>= (My_string &R){return strcmp(R.ptr,this->ptr)>=0 ? true:false;
}
bool My_string::operator<= (My_string &R){return strcmp(R.ptr,this->ptr)<=0 ? true:false;
}
My_string My_string::operator+= (const My_string &R){this->len += R.len;this->size += R.size;strcat(this->ptr,R.ptr);return *this;
}
My_string My_string::operator+= (const My_string &&R){this->len += R.len;this->size += R.size;strcat(this->ptr,R.ptr);return *this;
}ostream & operator<< (ostream &L,const My_string &R){L<<R.ptr<<endl;return L;
}istream & operator>> (istream &L,const My_string &R){char buff[1024];L>>buff;if(strlen(buff)<R.size){strcpy(R.ptr,buff);R.len = strlen(buff);}else cout<<"超出大小!"<<endl;return L;
}

main.cpp

#include "MyString.h"int main() {My_string s1("hello");My_string s2 = s1 + " world";s2.show();My_string s3 = "nihao";if(s2>s3){cout<<"s2大"<<endl;}else cout<<"s3大"<<endl;if(s1==s3){cout<<"s1==s3"<<endl;}else cout<<"s1!=s3"<<endl;if(s1=="hello"){cout<<"s1==hello"<<endl;}s1 += s3;s1.show();s3 += " world";s3.show();My_string s4;cout<<"请输入一个字符串:"<<endl;cin>>s4;cout<<s4;return 0;
}

运行结果

在这里插入图片描述

仿照stack类实现my_stack,实现一个栈的操作

代码如下

MyStack.h

#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>using namespace std;
class My_stack {
private:static const int MAX_SIZE = 10; // 定义栈的最大容量int data[MAX_SIZE];              // 固定大小的数组int topIndex;                    // 栈顶索引public:// 构造函数My_stack();// 拷贝构造函数My_stack(const My_stack &other);// 赋值运算符My_stack& operator=(const My_stack &other);// 析构函数~My_stack(){}// 返回栈顶元素int& top();// 返回栈是否为空bool empty() const;// 返回栈的大小int size() const;// 压入元素void push(int value);// 弹出元素void pop();// 交换两个栈的内容void swap(My_stack &other);
};// 全局函数用于交换两个栈
void swap(My_stack &a, My_stack &b);
#endif

MyStack.cpp

#include "MyStack.h"
My_stack::My_stack() : topIndex(-1) {}// 拷贝构造函数
My_stack::My_stack(const My_stack &other) : topIndex(other.topIndex) {for (int i = 0; i < topIndex; ++i) {data[i] = other.data[i];}
}// 赋值运算符
My_stack& My_stack::operator=(const My_stack &other) {if (this != &other) {topIndex = other.topIndex; // 更新栈顶索引for (int i = 0; i < topIndex; ++i) {data[i] = other.data[i]; // 复制元素}}return *this;
}// 返回栈顶元素
int& My_stack::top() {if (empty()) {cout<< "栈空!" << endl;exit(EXIT_FAILURE); // 直接退出程序}return data[topIndex - 1];
}// 返回栈是否为空
bool My_stack::empty() const {return topIndex == -1;
}// 返回栈的大小
int My_stack::size() const {return topIndex;
}// 压入元素
void My_stack::push(int value) {if (topIndex >= MAX_SIZE) {cout << "栈满!" << endl;exit(EXIT_FAILURE); // 直接退出程序}data[topIndex++] = value;
}// 弹出元素
void My_stack::pop() {if (empty()) {cout<< "栈空!" << endl;exit(EXIT_FAILURE); // 直接退出程序}--topIndex;
}// 交换两个栈的内容
void My_stack::swap(My_stack &other) {std::swap(topIndex, other.topIndex);for (int i = 0; i < MAX_SIZE; ++i) {std::swap(data[i], other.data[i]);}
}// 全局函数用于交换两个栈
void swap(My_stack &a, My_stack &b) {a.swap(b);
}

main.cpp

#include "MyStack.h"int main() {My_stack s;s.push(9);s.push(2);s.push(6);s.push(7);s.push(8);cout << "栈顶元素:" << s.top() << endl;cout << "栈的大小:" << s.size() << endl;s.pop();cout << "栈顶元素:" << s.top() << endl;My_stack s1;s1.push(1);s1.push(2);My_stack s2;s2 = s;swap(s2, s1); // 交换两个栈cout << "交换后的栈顶元素:" << s2.top() << endl;cout << "交换后另一个栈顶元素:" << s1.top() << endl;return 0;
}

运行结果

在这里插入图片描述

思维导图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

初学者必备:一文读懂大语言模型(LLM)入门攻略!

当前2024年&#xff0c;LLM领域发展日新月异&#xff0c;很多新的实用技术层出不穷&#xff0c;个人认为要跟上LLM的发展&#xff0c;需要掌握以下内容&#xff0c;并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识&#xff1a;推荐李宏毅的深度学习课程Python和num…

OpenCV图像分割(2)分水岭算法图像分割函数watershed()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用分水岭算法执行基于标记的图像分割。 该函数实现了分水岭算法的一种变体&#xff0c;即无参数基于标记的分割算法&#xff0c;在文献 [186]…

matlab中在一个图上持续画多条曲线的方法

在数据分析的过程中&#xff0c;会遇到一种情况&#xff0c;就是想对多组数据进行分析&#xff0c;这时就想把他们放在同一张图里&#xff0c;来看他们表现出来的特征。如下图所示&#xff1a; 例如&#xff0c;我这里有几组数据&#xff0c;想对他们的整体趋势进行分析。 1、…

乐观锁处理秒杀超卖问题及悲观锁解决一人一单

Service Transactional//事务控制 public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {ResourceSeckillVoucherServiceImpl seckillVoucherService;ResourceRedisIdWorker redisIdWorker;Re…

Navicat连接数据库

一、MySQL地卸载&#xff1a; 二、Navicat连接数据库&#xff1a; 安装navicat的安装&#xff1a; 错误解决方法&#xff1a; 实验过程&#xff1a; 在本地sql数据库可以访问&#xff0c;说明数据库开启 用navicat连接&#xff1a;出现问题&#xff1a; 将mysql用户登录的加密…

图论系列(dfs)9.25

一、主题空间 场地由若干主题空间与走廊组成&#xff0c;场地的地图记作由一维字符串型数组 grid&#xff0c;字符串中仅包含 "0"&#xff5e;"5" 这 6 个字符。地图上每一个字符代表面积为 1 的区域&#xff0c;其中 "0" 表示走廊&#xff0…

计算机毕设选题推荐-基于python的电子健康信息分析系统【源码+文档+调试】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、电子健康信息…

H7-TOOL脱机烧录增加国产3PEAK混合信号单片机TPS32和富芮坤FR8008,FR8003和FR2012支持

支持单路&#xff0c;1拖4和1拖16脱机烧录 3PEAKS思瑞浦混合信号单片机TPS32M支持 1、在线烧录&#xff0c;脱机烧录均正常。 2、注意事项&#xff1a;推荐使用整片擦除。 在线烧录&#xff1a; 脱机烧录&#xff1a; 接线效果&#xff1a; 富芮坤FR8008x支持&#xff0c;支…

校园自助打印系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;店长管理&#xff0c;打印店管理&#xff0c;打印服务管理&#xff0c;服务类型管理&#xff0c;预约打印管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&…

java基础课程-spring security基础课程

1. spring security介绍&#xff1a; 1.1 spring security定义&#xff1a; 2. Spring Security使用 2.1 用户身份认证&#xff1a; 2.1.1 写在配置文件中&#xff1a; 2.1.2 不用配置文件&#xff1a;&#xff0c;service实现UserDetailService这个类的的loadUserByUserNam…

CNVD漏洞和证书挖掘经验总结

前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题&#xff0c;根据过往成功归档的漏洞和未归档的漏洞总结出的经验&#xff0c;也确实给审核的大佬们添了很多麻烦&#xff08;主要真的没人教一下&#xff0c;闷着头尝试犯了好很多错误&#xff0c;希望各位以后交一个…

JavaScript类型转换和相等性详解

类型转换 10"objects" //10objects,数字10转换为字符串 "7"*"4" //28&#xff0c;两个字符串均转为数字,只要不是加&#xff0c;其他都按两个数字算 var n 1-"x"// NaN&#xff0c;字符串x无法转化为数字 n"objects"//…

微服务--Docker

Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言并遵从Apache2.0协议开源。Docker提供了一种轻量级、可移植和自包含的容器化环境&#xff0c;使开发人员能够在不同的计算机上以一致的方式构建、打包和分发应用程序。 一、Docker的基本概念 容器&#xff08;Contain…

TON生态系统开发指南:从零开始构建你的Web3应用

随着Web3的不断发展&#xff0c;TON&#xff08;The Open Network&#xff09;生态系统逐渐成为备受瞩目的区块链平台。依托其与Telegram的深度整合&#xff0c;TON生态为开发者提供了一个极具潜力的开发环境&#xff0c;特别是在社交、支付和金融这三个核心领域。本文旨在帮助…

企业源代码也需要加密?2024十款源代码加密软件排行榜

在当今数字化时代&#xff0c;源代码作为企业的核心资产&#xff0c;其重要性不言而喻。源代码不仅是企业技术创新的体现&#xff0c;更是商业机密和竞争优势的基石。然而&#xff0c;随着网络攻击和数据泄露事件的频发&#xff0c;源代码的安全性面临着前所未有的挑战。企业源…

零基础转行学网络安全怎么样?能找到什么样的工作?

网络安全对于现代社会来说变得越来越重要&#xff0c;但是很多人对于网络安全的知识却知之甚少。那么&#xff0c;零基础小白可以学网络安全吗&#xff1f;答案是肯定的。 零基础转行学习网络安全是完全可行的&#xff0c;但需要明确的是&#xff0c;网络安全是一个既广泛又深入…

centos7 更新 yum源 为 阿里云 LTS

centos7 更新 yum源 为 阿里云 按照下面的 步骤 1,2&#xff0c;3,4 来一遍 参考文档 CentOS yum源设置为国内aliyun yum源 https://developer.aliyun.com/article/1523301?spm5176.26934562.main.2.16c938e4ys9prQ CentOS 镜像 https://developer.aliyun.com/mirror/cent…

【每天学点AI】五个阶段带你了解人工智能大模型发展史!

20世纪50年代 NLP的早期研究主要基于规则的方法&#xff0c;依赖于语言学专家手工编写的规则和词典。这些规则通常是关于语法、语义和句法结构的人工规则。 例如一个简单的陈述句通常遵循“主语 谓语 宾语”的结构&#xff0c;每一个陈述句都以这种规则做标记。 那时候的NLP…

SpringCloud之服务网关zuul初级篇

SpringCloud之服务网关zuul初级篇 前面的文章我们介绍了&#xff0c;Eureka用于服务的注册于发现&#xff0c;Feign支持服务的调用以及均衡负载&#xff0c;Hystrix处理服务的 熔断防止故障扩散&#xff0c;Spring Cloud Config服务集群配置中心&#xff0c;似乎一个微服务框…

从 Tesla 的 TTPoE 看资源和算法

特斯拉的 ttpoe 出来有一段时间了&#xff0c;不出所料网上一如既往的一堆 pr 文&#xff0c;大多转译自 演讲 ppt 和 Replacing TCP for Low Latency Applications&#xff0c;看了不下 20 篇中文介绍&#xff0c;基本都是上面这篇文章里的内容&#xff0c;车轱辘话颠来倒去。…