C++ 一个基本的 MyString 实现和分析实践

文章目录

      • 1.需求分析
      • 2.代码实现
      • 3.编译运行

不必要背代码,语法到处都是,但是要熟悉实现逻辑,需求分析,以及对于具体的实现细节进行推敲,比如扩容机制、上下界限等问题的处理。

1.需求分析

  • 构造操作
    1.三个构造:构造函数、(深)拷贝构造函数和移动构造函数。
    2.两个赋值:(深)拷贝赋值运算符和移动赋值运算符。
    3.一个析构:析构函数释放内存,防止内存泄漏。

  • 运算符:
    1.重载 [] 运算符,用于访问字符串中的字符,并提供 const 和非 const 版本。
    2.重载 + 运算符,用于字符串拼接。
    3.重载 == 和 != 运算符用于字符串比较。
    4.重载 << 和 >> 运算符,用于输入输出操作。
    5.重载 =

  • 异常
    1.越界异常

知识点:三个构造、动态内存管理、RAII、深拷贝与移动语义、运算符重载、异常处理等。

2.代码实现

#include <iostream>
#include <cstring>  // For strlen, strcpy, etc.class MyString {
private:char* data;  // Pointer to the dynamically allocated arraysize_t length;  // Length of the string (not including null terminator)public:// Default constructorMyString() : data(nullptr), length(0) {}// Constructor from C-stringMyString(const char* str) {if (str) {length = std::strlen(str);data = new char[length + 1];  // Allocate memory for stringstd::strcpy(data, str);  // Copy string into memory} else {data = nullptr;length = 0;}}// Copy constructor (deep copy)MyString(const MyString& other) {length = other.length;if (other.data) {data = new char[length + 1];std::strcpy(data, other.data);} else {data = nullptr;}}// Move constructor (no deep copy, just transfer ownership)MyString(MyString&& other) noexcept : data(other.data), length(other.length) {other.data = nullptr;  // Release ownership of the old stringother.length = 0;}// Copy assignment operator (deep copy)MyString& operator=(const MyString& other) {if (this == &other) {return *this;  // Handle self-assignment}// Free existing memorydelete[] data;// Perform deep copylength = other.length;if (other.data) {data = new char[length + 1];std::strcpy(data, other.data);} else {data = nullptr;}return *this;}// Move assignment operator (transfer ownership)MyString& operator=(MyString&& other) noexcept {if (this == &other) {return *this;  // Handle self-assignment}// Free existing memorydelete[] data;// Transfer ownershipdata = other.data;length = other.length;other.data = nullptr;other.length = 0;return *this;}// Destructor (free the allocated memory)~MyString() {delete[] data;}// Get length of the stringsize_t size() const {return length;}// Overload operator[] to access characterschar& operator[](size_t index) {if (index >= length) {throw std::out_of_range("Index out of bounds");}return data[index];}const char& operator[](size_t index) const {if (index >= length) {throw std::out_of_range("Index out of bounds");}return data[index];}// Overload operator+ for string concatenationMyString operator+(const MyString& other) const {MyString newStr;newStr.length = length + other.length;newStr.data = new char[newStr.length + 1];// Copy first stringstd::strcpy(newStr.data, data);// Concatenate second stringstd::strcat(newStr.data, other.data);return newStr;}// Overload operator== for string comparisonbool operator==(const MyString& other) const {return std::strcmp(data, other.data) == 0;}// Overload operator!= for string comparisonbool operator!=(const MyString& other) const {return !(*this == other);}// Output stream overload (printing the string)friend std::ostream& operator<<(std::ostream& os, const MyString& str) {if (str.data) {os << str.data;}return os;}// Input stream overload (reading the string)friend std::istream& operator>>(std::istream& is, MyString& str) {char buffer[1000];  // Assume max input sizeis >> buffer;str = MyString(buffer);  // Use the constructor to assignreturn is;}
};int main() {// Example usage of MyString classMyString str1("Hello");MyString str2(" World");// ConcatenationMyString str3 = str1 + str2;std::cout << "Concatenated string: " << str3 << std::endl;// Comparisonif (str1 == MyString("Hello")) {std::cout << "str1 is equal to 'Hello'" << std::endl;}// AssignmentMyString str4;str4 = str3;std::cout << "Assigned string: " << str4 << std::endl;// Input and OutputMyString inputStr;std::cout << "Enter a string: ";std::cin >> inputStr;std::cout << "You entered: " << inputStr << std::endl;return 0;
}

3.编译运行

[jn@jn build]$ ./a.out
Concatenated string: Hello World
str1 is equal to 'Hello'
Assigned string: Hello World
Enter a string: WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
You entered: WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
[jn@jn build]$

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

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

相关文章

【永磁同步电机(PMSM)】 4. 坐标变换的 Matlab 仿真

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 坐标变换的 Matlab 仿真 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…

更换硬盘后,电脑装完系统进不去?或PE能识别硬盘但开机/启动/BIOS识别不了硬盘解决办法

由于现在的电脑主板&#xff0c;默认都是UEFI启动&#xff0c;硬盘只有使用GUID分区表&#xff0c;主板BIOS才找得到系统引导&#xff01; 而当我们拿到一块新硬盘&#xff0c;使用分区工具默认类型分区&#xff0c;默认是MBR类型&#xff0c;所以这种分区的硬盘&#xff0c;B…

14.面试算法-字符串常见算法题(三)

1. 字符串回文问题 1.1 LeetCode.125. 验证回文串 回文问题在链表中是重点&#xff0c;在字符串中同样是个重点。当初我去美团面试第一轮技术面的第一个算法题就是让写判断字符串回文的问题。 这个本身还是比较简单的&#xff0c;只要先转换成字符数组&#xff0c;然后使用双…

肺结节检测系统源码分享

肺结节检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件 日历期间、年期间、月期间及时分期间组件在不同的应用场景中发挥着重要的作用。这些组件通常用于表单、应用程序或网站中&#xff0c;以方便用户输入和选择特定的日期和时间范围。以下是这些组件的主要作用&a…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…

TryHackMe 第3天 | Pre Security (中)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。上一篇中简短介绍了计算机网络相关的知识&#xff0c;本篇博客将记录 网络协议 部分。 How the web works? DNS in detail DNS (Domain name system&…

Java面试篇-AOP专题(什么是AOP、AOP的几个核心概念、AOP的常用场景、使用AOP记录操作日志、Spring中的事务是如何实现的)

文章目录 1. 什么是AOP2. AOP的几个核心概念3. AOP的常用场景4. 使用AOP记录操作日志4.1 准备工作4.1.1 引入Maven依赖4.1.2 UserController.java4.1.3 User.java4.1.4 UserService.java 4.2 具体实现&#xff08;以根据id查询用户信息为例&#xff09;4.2.1 定义切面类&#x…

SkyWalking 环境搭建部署

架构简介 skywalking agent : 和业务系统绑定在一起,负责收集各种监控数据skywalking oapservice : 是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapserv…

华为HarmonyOS地图服务 7- 在地图上绘制标记

场景介绍 本章节将向您介绍如何在地图的指定位置添加标记以标识位置、商家、建筑等。 点标记用来在地图上标记任何位置,例如用户位置、车辆位置、店铺位置等一切带有位置属性的事物。Map Kit提供的点标记功能(又称 Marker)封装了大量的触发事件,例如点击事件、长按事件、…

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时&#xff0c;队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展&#xff0c;如果现在负载加重&#xff0c;那么只需要创建更多的消费者来消费处理消息即可。 默…

linux网络编程5

24.9.21学习目录 一.TCP1.TCP流程2.TCP相关函数3.三次握手 一.TCP 1.TCP流程 服务器流程&#xff1a; 创建套接字socket&#xff08;&#xff09;将套接字与服务器网络信息结构体绑定bind&#xff08;&#xff09;将套接字设置为监听状态listen&#xff08;&#xff09;阻塞等…

进程间的通信4 共享内存

共享内存 1.共享内存简介 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中&#xff0c;减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在 Linux 系统中通过 ipcs -m 查看所有的共享内存 共享内存模型图 2.共享内存的创建 1.函数头文件 #…

Java算法专栏

专栏导读 在当今这个技术日新月异的时代&#xff0c;Java算法作为软件开发的核心&#xff0c;对于提升程序性能和解决复杂问题至关重要。本“Java算法”专栏旨在帮助读者深入理解Java编程语言中的算法原理和应用&#xff0c;通过实战案例和深入分析&#xff0c;使读者能够掌握…

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&#xff1a;

Python基础学习(3)

目录 一&#xff0c;函数 1&#xff0c;函数的定义 2&#xff0c;函数的参数 1&#xff0c;默认值 2&#xff0c;传参 3&#xff0c;返回值 4&#xff0c;变量的作用域 5&#xff0c;函数的调用 二&#xff0c;常用数据结构 1&#xff0c;列表 列表的定义 列表的特性…

【Geoserver使用】REST API调用(工作空间部分)

文章目录 前言一、Geoserver REST API(GeoServer Workspace)二、GeoServer Workspace接口使用1.GET请求 /workspaces2.POST请求 /workspaces3.GET请求 /workspaces/{workspaceName}4.PUT /workspaces/{workspaceName}5.DELETE /workspaces/{workspaceName} 总结 前言 根据Geos…

C++ | Leetcode C++题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution { public:string originalDigits(string s) {unordered_map<char, int> c;for (char ch: s) {c[ch];}vector<int> cnt(10);cnt[0] c[z];cnt[2] c[w];cnt[4] c[u];cnt[6] c[x];cnt[8] c[g];cnt[3] c[h] - …

YOLOv10 简介

YOLOv10&#xff0c;由清华大学的研究人员基于 Ultralytics Python 包构建&#xff0c;引入了一种全新的实时目标检测方法&#xff0c;该方法解决了以往 YOLO 版本中后处理和模型架构方面的不足。通过消除非极大值抑制&#xff08;NMS&#xff09;并优化各种模型组件&#xff0…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…