将string类中能够实现的操作都封装在MyString类中

news/2024/9/19 0:49:05/ 标签: c++, qt, 笔记, 开发语言

包括:

构造函数

析构函数

重载 = ,[],+=,+,==,!=,<,>,<=,>=,<<,>>;

at;

data;

c_str;

empty;

length;

capasityacity;

clear;

push_back;

pop_back;

append;

程序中我封装了大部分,相似的就忽略了()

/*将string类中能够实现的操作都封装在MyString类中
构造函数
析构函数
重载 = ,[],+=,+,==,!=,<,>,<=,>=,<<,>>;
at;
data;
c_str;
empty;
length;
capasityacity;
clear;
push_back;
pop_back;
append;
*/#include <iostream>
#include <cstring>
using namespace std;class MyString
{
private:char *str;size_t len;size_t capasity;public:// 构造函数MyString(){cout << "无参数构造函数" << endl;}explicit MyString(const char *s) : str(new char[strlen(s) + 1]), len(strlen(s)), capasity(strlen(s) + 1){strcpy(str, s);cout << "有参数构造函数" << endl;}// 析构函数~MyString(){delete[] str;cout << "析构函数" << endl;}// 扩容函数void expand(){capasity *= 2; // 2倍扩容char *tmp = new char[capasity];strcpy(tmp, str); // 拷贝致新的字符串delete[] str;     // 释放旧的字符串str = tmp;cout << "扩容" << endl;}// 赋值运算符=MyString &operator=(const MyString &src){if (this != &src){delete[] str;len = src.len;str = new char[len + 1];capasity = src.capasity;strcpy(str, src.str);}return *this;}// 索引运算符[]char &operator[](int index){return str[index];}// 拼接运算符+MyString operator+(const MyString &src) const{char *newStr = new char[len + src.len + 1];strcpy(newStr, str);strcat(newStr, src.str);MyString result(newStr); // 使用新的字符串构造结果对象result.capasity = len + src.len + 1;delete[] newStr; // 释放临时分配的内存return result;}// 尾部添加+=MyString &operator+=(const MyString &src){char *newStr = new char[len + src.len + 1];strcpy(newStr, str);strcat(newStr, src.str);MyString result(newStr); // 使用新的字符串构造结果对象result.capasity = len + src.len + 1;delete[] newStr; // 释放临时分配的内存return result;}// 比较运算>bool operator>(const MyString &src) const{return strcmp(str, src.str) > 0;}// 比较运算<bool operator<(const MyString &src) const{return strcmp(str, src.str) < 0;}// 比较运算符==bool operator==(const MyString &src) const{return strcmp(str, src.str) == 0;}// at 访问指定字符,有边界检查char &at(int index){if (index < 0 || index >= len){cout << "index out of range" << endl;exit(EXIT_FAILURE);}return str[index];}// data 返回字符串首字母的指针char *data(){return str;}// c_str返回字符串的不可修改的c字符数组版本const char *c_str(){return str;}// empty判断是否为空bool empty(){return strlen(str) == 0;}// length返回字符串的长度size_t length(){return len;}// capasityacity返回字符串的容量// clear 清空字符串void clear(){len = 0;str[0] = '\0'; // 置空}// push_back 向字符串尾部添加字符void push_back(char c){if (len + 1 >= capasity){expand();}str[len] = c;len++;str[len] = '\0';}// pop_back 删除字符串尾部字符void pop_back(){if (len > 0){len--;           // 字符串长度减一str[len] = '\0'; // 减少一个字符}}// 外部函数友元:// 输入输出流运算符<<friend ostream &operator<<(ostream &os, const MyString &s);
};// 输出流运算符<<
ostream &operator<<(ostream &out, const MyString &s)
{out << s.str << endl;return out;
}// 测试代码
int main()
{// 构造函数MyString s1("hello");MyString s2("world");// 测试重载加号MyString s3 = s1 + s2;// 测试重载<<cout << s1;// 测试+=s1 += s2;cout << s1;// 测试比较>if (s1 > s2){cout << "s1 > s2" << endl;}else{cout << "s1 <= s2" << endl;}// 测试at函数s1.at(0) = 'H';cout << s1;// 测试data函数cout << s3.data() << endl;// 测试length函数cout << s3.length() << endl;// 测试clear函数s2.clear();cout << s2.length() << endl;s2.push_back('a');cout << s2;// 测试扩容s1.push_back('A');cout << s1;// 测试pop_back函数s1.pop_back();cout << s1;return 0;
}
/*数值转换函数:可以试试
stoi;
stol;
stoll;
stoul;
stoull;
stof;
stod;
stold;*/


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

相关文章

el-time-select 动态增加时间

<template><div><div v-for"(item, index) in timeSlots" :key"index"><el-time-select placeholder"起始时间" v-model"item.startTime" :picker-options"{start: 00:00,step: 00:15,end: 23:59,}"&g…

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

用实时计算释放当下企业大数据潜能

摘要&#xff1a;本文整理自阿里云高级产品解决方案架构师王启华&#xff08;敖北&#xff09;老师在 Flink Forward Asia 2023 中闭门会的分享。内容分为以下四个部分&#xff1a; 业务需求变化推动架构演进实时计算对于企业生产的意义从技术架构和技术场景来看发展和迭代客户…

使用 streamlink 把 m3u8 转为 mp4

问题描述&#xff0c; 背景&#xff0c; 来源&#xff1a; 下载 m3u8 ts —> 转为mp4, 按照以往的做法&#xff0c; 就是使用 python requests 一步一步地下载 m3u8, ts&#xff0c; 然后转换。 但是个人写的东西&#xff0c;毕竟问题比较多。 而且&#xff0c; 但是&…

2024 年的 Web3 游戏:演变、趋势和市场动态

Web3 游戏行业在经历了多年的快速发展和变革之后&#xff0c;正在2024年迎来全新的阶段。这个行业从最初的边玩边赚&#xff08;Play-to-Earn, P2E&#xff09;模式出发&#xff0c;如今正在向更为平衡的“边玩边赚”模式转型。这种转型不仅解决了早期 P2E 模式下存在的可持续性…

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到&#xff0c;在查询的时候Mapper对象已经是被代理过后的&#xff1a; 所以会执行invoke方法&#xff0c;其底层实现就是JDK的动态代理&#xff1a; 如下图所示&#xff0c;如果MethodCache里面存在方法&#xff0c;则判断这个方法是否为default方…

python实现人工神经网络

要编写一个简单的人工神经网络&#xff08;ANN&#xff09;程序&#xff0c;可以从一个基本的前馈神经网络开始&#xff0c;该网络通常包括输入层、一个或多个隐藏层以及输出层。在这个例子中&#xff0c;将使用Python的NumPy库来处理数学运算&#xff0c;并使用Sigmoid函数作为…

【Python批量下载Landsat数据】

批量下载Landsat数据&#xff08;例如Landsat 8 OLI/TIRS&#xff09;可以通过多种方法实现&#xff0c;但通常涉及使用在线服务或API接口&#xff0c;如USGS EarthExplorer、Google Earth Engine&#xff08;GEE&#xff09;或者专门的库如landsatxplore&#xff08;一个Pytho…

配置了680M和780M集显的AMD CPU列表

AMD Radeon 680M 核显配置在以下型号的 CPU 上面&#xff1a; - Ryzen 9 6980HX&#xff1a;8 核心 16 线程&#xff0c;最高加速时钟频率可达 5.0GHz&#xff0c;配备 12CU RDNA 2 架构的 Radeon 680M 核显&#xff0c;频率为 2.4GHz 。 - Ryzen 9 6900HX&#xff1a;8 核心 …

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址&#xff1a;https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端&#xff0c;导出项目…

深入Redis:细谈持久化

Redis的数据是保存在内存中的&#xff0c;内存里面的数据是不持久的&#xff0c;要想做到持久化&#xff0c;必须要把在内存中的数据储存到硬盘上。 Redis速度非常快&#xff0c;数据只有在内存中才有这样的速度&#xff0c;但是为了持久&#xff0c;数据还是要想办法保存到硬…

Java Excel转PDF(免费)

目前市面上 Excel 转 PDF 的组件较多&#xff1a; 收费&#xff1a;aspose、GcExcel、spire开源&#xff1a;jacob、itextpdf 其中收费的组件封装得比较好&#xff0c;代码简洁&#xff0c;转换的效果也很好&#xff0c;但收费也高得离谱&#xff1a; 为了成本考虑&#xff…

videojs宫格视频选择播放

项目需要四宫格播放视频&#xff0c;而且还要实现点击视频加入播放。 首先&#xff0c;肯定要实现再一个页面上显示多个视频源并播放视频&#xff1a; <template><div><div v-for"(item,index) in videoList" :key"index" class"te…

在ElementUI项目中集成iconfont图标库

在前端项目开发中经常会遇到使用的组件库提供的ICON图标不够用的情况。最常见的解决方案无非就是把设计图的图标切图引入到项目中。还有就是使用svg图标&#xff0c;封装一个渲染组件在项目里面直接引入这个组件。 本文将介绍另一种方法&#xff0c;即集成iconfont图标库的图标…

9、LLaMA-Factory项目微调介绍

1、LLaMA Factory 介绍 LLaMA Factory是一个在GitHub上开源的项目&#xff0c;该项目给自身的定位是&#xff1a;提供一个易于使用的大语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;支持LLaMA、Baichuan、Qwen、ChatGLM等架构的大模型。更细致的看&#xff0c;该项…

flutter 手写时钟

前言&#xff1a; 之前看过别人写的 js实现的 时钟表盘 挺有意思的&#xff0c;看着挺好 这边打算自己手动实现以下。顺便记录下实现过程&#xff1a;大致效果如下&#xff1a; 主要技术点&#xff1a; 表盘内样 倒角&#xff1a; 表盘下半部分是有一点倒角的感觉&#xff0c;…

尚品汇-MQ模块搭建测试、消息不丢失(重)(四十三)

目录&#xff1a; &#xff08;1&#xff09;消息不丢失 &#xff08;2&#xff09;消息确认 &#xff08;3&#xff09;消息确认业务封装 &#xff08;4&#xff09;封装发送端消息确认 &#xff08;5&#xff09;封装消息发送 &#xff08;6&#xff09;发送确认消息测试…

鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务

应用可以通过photoAccessHelper的接口&#xff0c;对媒体资源&#xff08;图片、视频&#xff09;进行相关操作。 说明 在进行功能开发前&#xff0c;请开发者查阅[开发准备]&#xff0c;了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。文档中使用到p…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

大数据系列之:查看Centos服务器用户可以创建的最大线程数、查看系统内核支持的最大线程数、查看系统支持的最大进程数、设置最大线程数限制、查看进程使用的线程数

大数据系列之:查看Centos服务器用户可以创建的最大线程数、查看系统内核支持的最大线程数、查看系统支持的最大进程数、设置最大线程数限制、查看进程使用的线程数 显示当前用户的资源限制查看用户可以创建的最大线程指定进程的资源限制查看系统内核支持的最大线程数查看系统支…