当前位置: 首页 > news >正文

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;
}

运行结果

在这里插入图片描述

思维导图

在这里插入图片描述

相关文章:

  • vue实现左侧数据拖拽到右侧区域,且左侧数据保留且左侧数据不能互相拖拽改变顺序
  • 注册中心Eureka
  • 面试-2024年9月13号
  • I2C通信中的当前地址指针(CADDR)工作原理
  • 【韩顺平Java笔记】第3章:变量
  • Spring Boot 配置全流程 总结
  • 【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
  • 51单片机和ARM单片机的区别
  • “领航猿1号” 正式更名为 “AGI舰长”
  • 代码随想录冲冲冲 Day59 图论Part10
  • 数据结构 ——— C语言实现无哨兵位单向不循环链表
  • Linux基础命令lsblk详解
  • vue限定类型上传文件 最简单实践(单个可文件、可图片)
  • Hive数仓操作(五)
  • STM32--GPIO点亮LED灯(手把手,超详细)
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [笔记] php常见简单功能及函数
  • axios 和 cookie 的那些事
  • es6要点
  • Java 最常见的 200+ 面试题:面试必备
  • javascript数组去重/查找/插入/删除
  • python大佬养成计划----difflib模块
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从setTimeout-setInterval看JS线程
  • 将回调地狱按在地上摩擦的Promise
  • 如何设计一个微型分布式架构?
  • 一、python与pycharm的安装
  • 移动端 h5开发相关内容总结(三)
  • 硬币翻转问题,区间操作
  • 用mpvue开发微信小程序
  • 追踪解析 FutureTask 源码
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ionic异常记录
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​iOS安全加固方法及实现
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #13 yum、编译安装与sed命令的使用
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • $GOPATH/go.mod exists but should not goland
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)uboot源码分析
  • (十三)Flask之特殊装饰器详解
  • .cn根服务器被攻击之后
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 的程序集加载上下文
  • .net 调用海康SDK以及常见的坑解释