【C++】手动实现String类的封装(分文件编译)

news/2024/9/19 0:49:44/ 标签: c++, 开发语言, linux, c语言

        实现了String类的大部分封装,采用分文件编译 

//mystring.h
#ifndef MYSTRING_H
#define MYSTRING_H#include <iostream>
#include <cstring>
using namespace std;class myString
{
private:char *str;    //定义一个字符串int size;     //记录字符串长度public://成员函数://1.构造函数myString(const char* s);//2.析构函数~myString();//3.为字符串赋值函数 "="myString & operator=(const myString &other);//4.访问指定字符,有边界检查 "at"char &s_at(int index);//5.访问指定字符 "operator[]"char &s_operator(int index);//6.返回指向字符串首字符的指针 "data"char *s_data();//7.返回字符串的不可修改的C字符数组版本 "c_str"const char* s_c_str()const;//8.检查字符串是否为空 "empty"bool empty();//9.返回字符串长度 "size"int s_size();//10.返回字符串长度 "length"int s_lenth();//11.返回当前对象分配的存储空间能保存的字符数量 "capacity"int s_capacity();//12.清除内容 "clear"void s_clear();//13.后附字符到结尾 "push_back"void s_push_back(char c);//14.移除末尾字符 "pop_back"void s_pop_back();//15.后附字符到结尾 "append"void s_append(const char *s);//16.后附字符到结尾myString &operator+=(const myString &other);//17.连接两个字符串或者一个字符串和一个字符const myString operator+(const myString &other)const;//18.比较字符串bool operator==(const myString &other) const;bool operator!=(const myString &other) const;bool operator<(const myString &other) const;bool operator>(const myString &other) const;bool operator<=(const myString &other) const;bool operator>=(const myString &other) const;//19.输入输出friend ostream &operator<<(ostream &os, const myString &s);friend istream &operator>>(istream &is, myString &s);
};#endif // MYSTRING_H
//mystring.cpp
#include "mystring.h"
myString::myString(const char* s)
{size = strlen(s);             //求传入的字符串长度str = new char[size+1];       //申请空间存储字符串strcpy(str,s);                //将字符串拷贝到str中
}myString::~myString()
{delete[] str;
}myString &myString::operator=(const myString &other)
{if(this != &other){delete[] str;size = other.size;str = new char[size + 1];strcpy(str, other.str);}return *this;
}char &myString::s_at(int index)
{if(index < 0 || index >= size){cout<<"输入错误"<<endl;}return str[index];
}char &myString::s_operator(int index)
{return str[index];
}char *myString::s_data()
{return str;
}const char *myString::s_c_str() const
{return str;
}bool myString::empty()
{return size == 0;
}int myString::s_size()
{return size;
}int myString::s_lenth()
{return size;
}int myString::s_capacity()
{return size+1;       //有一个'\0'
}void myString::s_clear()
{delete[] str;str = NULL;size = 0;
}void myString::s_push_back(char c)
{delete[] str;str = new char[size+1];str[size-1] = c;str[size] = '\0';
}void myString::s_pop_back()
{if(size > 0){size--;str[size] = '\0';}
}void myString::s_append(const char *s)
{int new_size = size + strlen(s);char* temp = str;str = new char[new_size + 1];     // 分配新内存strcpy(str, temp);                // 复制旧字符串strcat(str, s);                   // 追加新字符串delete[] temp;                    // 释放旧内存size = new_size;
}myString &myString::operator+=(const myString &other)
{s_append(other.str);return *this;
}const myString myString::operator+(const myString &other) const
{myString temp(*this);temp.s_append(other.str);return temp;
}bool myString::operator==(const myString &other) const {return strcmp(str, other.str) == 0;
}bool myString::operator!=(const myString &other) const {return strcmp(str, other.str) != 0;
}bool myString::operator<(const myString &other) const {return strcmp(str, other.str) < 0;
}bool myString::operator>(const myString &other) const {return strcmp(str, other.str) > 0;
}bool myString::operator<=(const myString &other) const {return strcmp(str, other.str) <= 0;
}bool myString::operator>=(const myString &other) const {return strcmp(str, other.str) >= 0;
}istream &operator>>(istream &is, myString &s)
{char buffer[1024];   // 假设输入的字符串不超过1024个字符is >> buffer;       // 从输入流中读取字符串s = buffer;         // 将读取的字符串赋值给 myString 对象return is;          // 返回输入流的引用
}ostream &operator<<(ostream &os, const myString &s)
{os<<s.s_c_str();return os;
}

 

//main.cpp
#include "mystring.h"
int main()
{myString s1("hello");cout<<s1<<endl;cout<<"*************************"<<endl;myString s2("world");cout<<s1+s2<<endl;if(s1>s2 == 1){cout<<"s1 > s2"<<endl;}else{cout<<"s1 < s2"<<endl;}return 0;
}

输出结果如下:


http://www.ppmy.cn/news/1519947.html

相关文章

线性代数 第五讲:线性方程组_齐次线性方程组_非齐次线性方程组_公共解同解方程组_详解

线性方程组 文章目录 线性方程组1.齐次线性方程组的求解1.1 核心要义1.2 基础解系与线性无关的解向量的个数1.3 计算使用举例 2. 非齐次线性方程的求解2.1 非齐次线性方程解的判定2.2 非齐次线性方程解的结构2.3 计算使用举例 3.公共解与同解3.1 两个方程组的公共解3.2 同解方程…

鸿蒙界面开发(五):相对布局

相对布局RelativeContainer 相对布局的容器&#xff0c;支持容器内部的子元素设置相对位置关系&#xff0c;适用于界面复杂场景的情况&#xff0c;对多个子组件进行对齐和排列。子元素支持指定兄弟或父元素作为锚点&#xff0c;基于锚点做相对位置布局。 锚点&#xff1a;通过…

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备&#xff08;如手机、平板、电脑等&#xff09;发送过来的 高质量的立体声音频。简单来说&#xff0c;它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能&#xff1a; 接…

vue3 监听

watch &#xff08;1&#xff09;监听ref 状态的变化 const num ref(1) watch(num,(newValue,oldValue)>{console.log(newValue,oldValue);//2,1 }) setTimeout(()>{num.value },500)&#xff08;2&#xff09;computed const num ref(1); const double computed((…

惠中科技光伏清洗剂:绿色清洁,引领光伏行业新潮流

在当今全球能源转型的大潮中&#xff0c;光伏产业作为绿色能源的重要组成部分&#xff0c;正以前所未有的速度蓬勃发展。然而&#xff0c;随着光伏板在户外环境的长时间暴露&#xff0c;其表面不可避免地会积累灰尘、鸟粪、油污等污染物&#xff0c;严重影响光伏板的透光率和发…

Gorm--Scan

在 Gorm 中&#xff0c;Scan 是一个用于将查询结果映射到自定义结构体或变量的函数。与 Find 或 First 不同&#xff0c;Scan 允许你将查询结果存储到与数据库模型不完全匹配的结构体中。它特别适合用于自定义查询结果或联合查询的场景。 type Result struct {Name stringEma…

#单片机基础 笔记二

SPI中断 1.SPI总线协议 1.1协议介绍 SPI接口是Motorola &#xff08;motorola | Smartphones, Accessories & Smart Home Devices&#xff09;首先提出的全双工三线/四线同步串行外围接口采用主从模式&#xff08;Master Slave&#xff09;架构。 时钟由Master控制&#xf…

ELK学习笔记——如何给Kibana新增用户和角色

Kibana新增用户和角色 首先用超管账号登录上Kibana&#xff0c;按照下面步骤操作 1、创建角色 按图操作 2、创建用户 按图操作 3、给用户分配角色 至此&#xff0c;角色和用户绑定成功&#xff1b; 最后&#xff0c;可以退出管理员账号&#xff0c;登录这个新…

github私有仓库通过action部署hexo到公开仓库

github私有仓库通过action部署hexo到公开仓库 有一段时间一直将博客md文件直接放到公开仓库然后通过工作流action创建一个gh-page分支&#xff0c;来实现部署 但是这样做有一个问题&#xff0c;如果你的源文件&#xff0c;或者配置文件中有涉及变量&#xff0c;或者密钥key&a…

Linux-vim

文章目录 vi和vimvim的基本概念vim的基本操作vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作更改跳至指定的行 vim末行模式命令集列出行号跳到文件中的某一行查找字符保存文件推出vim vi和vim vi/vim的区别简单点来说&#xff0c;…

Linux C 内核编程 /proc 编程例子

直接上代码 proc_demo.c内核版本&#xff1a; 5.4.0-150-generic #include <linux/module.h> #include <linux/sched.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/uaccess.h> #include <linux/slab.h>s…

threading.local的使用

python中的threading.local对象 在Python中&#xff0c;使用threading.local对象的意义在于为每个线程提供了一种安全地存储和访问线程局部变量的方式。这种机制对于多线程编程特别有用&#xff0c;因为它可以帮助开发者避免一些常见的多线程编程问题&#xff0c;如数据竞争、…

技术周刊 | Rspack 1.0、v0 支持 Vue、2024 年度编程语言排行榜、Ideogram 2.0、从 0 实现一个 React

大家好&#xff0c;我是童欧巴&#xff0c;欢迎来到第 126 期技术周刊。 资讯 Rspack 1.0 Rspack 1.0 正式发布&#xff0c;作为一款基于 Rust 的高性能 JavaScript 打包工具&#xff0c;它兼容 webpack API 和生态&#xff0c;提供了显著提升的构建性能。1.0 版本在性能、兼…

第三章:实时流数据处理与分析

目录 3.1 流处理框架深入解析与实战 Flink与Kafka Streams的性能对比&#xff1a;事件驱动架构的代码实现 1. Apache Flink&#xff1a;流处理的“性能怪兽” 2. Kafka Streams&#xff1a;轻量级、低延迟的流式处理框架 实时异常检测与报警系统&#xff1a;结合Flink CEP…

【Transformer】基本概述

文章目录 提出背景核心思想—注意力机制流程解析参考资料 提出背景 在Transformer模型出现之前&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变体&#xff0c;如长短期记忆网络&#xff08;LSTM&#xff09;和门控循环单元&#xff08;GRU&#xff09;&#xff0c;…

版本控制工具git

版本控制工具 git 数据库 > 有代码历史版本 > 仓库 每个文件都是不同的历史版本&#xff0c;以便恢复 集中式版本控制系统 例如&#xff1a;SVN 缺陷&#xff1a; 1.依赖于中心服务器 分布式的版本管理系统 只有程序员用 git 只有需要在同步代码的时候需要联网 程…

Java笔试面试题AI答之面向对象(9)

文章目录 49. 简述Java继承时&#xff0c;类的执行顺序是什么&#xff1f;一、类的静态成员初始化顺序二、对象的初始化顺序三、总结 50. 举例说明什么情况下会更倾向于使用抽象类而不是接口&#xff1f;1. 当需要定义和实现部分通用行为时2. 当需要访问修饰符或方法修饰符时3.…

sqlite3的db.wait方法:等待所有查询完成

Node.js中sqlite3的db.wait方法深入解析 在Node.js环境中&#xff0c;sqlite3库为开发者提供了一个与SQLite数据库进行交互的简洁API。在处理数据库操作时&#xff0c;有时需要等待直到所有的查询都完成&#xff0c;这时db.wait方法就显得尤为重要。本文将深入解析sqlite3库中…

基于Python的机器学习系列(22):高斯混合模型(GMM)聚类的改进版

在之前的篇章中&#xff0c;我们介绍了高斯混合模型&#xff08;GMM&#xff09;及其基本实现。本文将扩展这一模型&#xff0c;重点是引入早停机制来提高训练效率&#xff0c;并且在训练过程中每隔一定的迭代次数绘制聚类结果&#xff0c;以便观察模型的收敛情况。 引入早停机…

Windows下使用pm2管理多个前端vue项目

1. 安装Node.js和npm: 确保你已经在Windows系统上安装了Node.js和npm。你可以在Node.js的[官方网站](https://nodejs.org/)下载并安装适合你系统的版本。 2. 安装pm2: 打开命令提示符(或PowerShell),运行以下命令来全局安装pm2: npm install pm2 -g 3. 创建pm2配置…