首页 > 编程语言 >用C++实现string类

用C++实现string类

时间:2024-02-20 12:45:01浏览次数:36  
标签:const string 实现 C++ operator MyString include

今天用C++实现了一个string类,包括构造函数、拷贝构造、赋值构造、流输出、移动构造、重载+号, 发现很多细节都没有考虑到,细节都在注释中,贴在这里作为备忘吧。

 

  1 #include <iostream>
  2 #include <cstring>
  3 
  4 using namespace std;
  5 
  6 
  7 class MyString {
  8 public:
  9     MyString();
 10     MyString(const char *str);
 11     MyString(const MyString& s);
 12     ~MyString();
 13     MyString& operator=(const MyString& s);
 14     MyString operator+(const MyString& s); // 返回一个新的临时变量,而不是*this,一开始写错了成MyString&
 15     friend std::ostream& operator<<(std::ostream& os, const MyString& s); // ostream来调用这个函数,因此要做成friend
 16     const char* c_str() const; // 注意要const,避免某些对象是const的需要调用而这个函数不是const的会调用不了
 17     int size() const; // 同上
 18     MyString(MyString&& s); // C++11,需要转移数据,注意s不能是const,因为会修改s
 19 private:
 20     void _cleanup(); // 通用方式
 21     char *_str; //沿用C语言的风格,遇到0最为结束符号
 22     int _size; // _size冗余存储长度
 23 };
 24 
 25 const char* MyString::c_str() const {
 26     return _str;
 27 }
 28 
 29 int MyString::size() const {
 30     return _size;
 31 }
 32 
 33 MyString::MyString(): _str(nullptr), _size(0){
 34 }
 35 
 36 MyString::MyString(const char * str) {
 37     if (str == nullptr) {
 38         _size = 0;
 39         _str = nullptr;
 40         return;
 41     }
 42     _size = strlen(str);
 43     _str = new char[_size+1];
 44     strcpy(_str, str);
 45     _str[_size] = '\0';
 46 }
 47 
 48 MyString::MyString(const MyString& s) {
 49     _size = s._size; // 为啥可以返回s._size?因为在类的成员函数中可以访问同类型实例对象的私有成员变量,参考:https://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595741.html
 50     _str = new char[_size+1];
 51     strcpy(_str, s._str);
 52     _str[_size] = '\0';
 53 }
 54 
 55 std::ostream& operator<<(std::ostream& os, const MyString& s) {
 56     os << s.c_str(); // s_str函数需要const,因为s是const
 57     return os;
 58 }
 59 
 60 void MyString::_cleanup() {
 61     _size = 0;
 62     if (_str) {
 63         delete []_str; // 注意是删除数组,因此要带上[]
 64         _str = nullptr;
 65     }
 66 }
 67 
 68 MyString& MyString::operator=(const MyString& s) {
 69     _cleanup();
 70     _size = s.size(); // size函数需要const,因为s是const的
 71     _str = new char[_size+1];
 72     strcpy(_str, s._str);
 73     _str[_size] = '\0';
 74     return *this;
 75 }
 76 MyString MyString::operator+(const MyString& s) {
 77     MyString newS;
 78     newS._size = _size + s._size;
 79     newS._str = new char[newS._size+1];
 80 
 81     strcpy(newS._str, _str);
 82     strcpy(newS._str+_size, s._str);
 83     newS._str[newS._size] = '\0';
 84     return newS;
 85 }
 86 
 87 MyString::~MyString() {
 88     _cleanup();
 89 }
 90 
 91 MyString::MyString(MyString&& s) {
 92     _cleanup();
 93     _str = s._str;
 94     _size = s._size;
 95     s._str = nullptr;
 96     s._size = 0;
 97 }
 98 
 99 int main() {
100     std::cout << "Hello, World!" << std::endl;
101 
102     MyString s("Hello, World!");
103     MyString ss(s);
104     std::cout << ss << std::endl;
105     ss = ss+s;
106     std::cout << ss << std::endl;
107 
108     MyString sss(std::move(ss)); // move的用法
109     std::cout << "sss:" << sss << " ss:" << ss << std::endl;
110     return 0;
111 }

 

标签:const,string,实现,C++,operator,MyString,include
From: https://www.cnblogs.com/longbozhan/p/18022856

相关文章

  • C++(2)Big-Endian VS Littler-Endian
    1、概念大端:高字节存放在低地址,低字节存放在高地址。小端:低字节存放在低地址,高字节存放在高地址。简称“低低小”2、如何判别大端小端intIsSmallEnd2(){ inti=0x11223344; if(*(char*)(&i)==0x44) { return1; } else return0;}......
  • c++小游戏合集
    1.恶魔轮盘赌恶魔轮盘赌代码#include<windows.h>#include<bits/stdc++.h>usingnamespacestd;intYour=6,Other=6;stringdaojuname[]={"放大镜","手铐","小刀","烟","饮料"};doubleYourmoney;intshi,kong;intq[10],......
  • Unity引擎2D游戏开发,水和荆棘的逻辑实现
    Unity引擎2D游戏开发,水和荆棘的逻辑实现新建瓦片新建Water与Spike的Tilemap对新建的两个Tilemap绑定TilemapCollider2D,这样他们就会有碰撞判定,勾选上IsTrigger为了标识伤害的来源,将Water和Spike打上标签Tag添加好荆棘的瓦片,不要忘记选中Spike的图层进行添加添加好后,......
  • C++ lambda表达式
    C++lambda表达式,又称为闭包,匿名函数入门语法举个例子autof=[](inta,intb){returna<b;};std::vector<int>vec={0,11,2,23,4};std::sort(vec.begin(),vec.end(),f);上面的就是通过一个简单的匿名函数来简化了排序,lambda表达式具体语法如下......
  • Java实现静态链表
    本文参照了大话数据结构的静态链表的c语言实现packagecom.luoyi.list;/***@Description静态链表*@AuthorLuoyi*@Date2024/2/19**注:1.索引为0的节点不存放数据,cur指向第一个空闲节点的下标*2.最后一个元素(即下标Maxsize-1)的cur指向第一个有效数......
  • JS-SDK 配置,实现微信分享功能
    官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html在使用微信分享功能之前,需要进行如下配置,参考官方文档1.绑定域名此处看官方文档2.引入JS文件此处看官方文档3.通过config接口注入权限验证配置这里进行步骤分解3.1调用后端签名接口......
  • RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • 通用方式实现Map
    通用方式实现MapChatGpt实现展示地图并在地图上提供操作选项的技术栈可以包括:Web开发技术:HTML、CSS、JavaScript地图API:如GoogleMapsAPI、MapboxAPI、Leaflet等前端框架:如React、Vue.js、Angular等后端技术:如Node.js、Django、Flask等(如果需要与后端交互)数据库:如MySQL......
  • 银行网点文件下发 怎样实现安全高效数据分发?
    银行网点文件下发通常指的是银行内部或银行与外部机构之间的文件传递和分发流程。这个过程可能涉及多种文件,包括但不限于政策文件、操作规程、业务通知、审计报告等。为了确保文件的安全、准确和及时传递,银行通常会建立一套详细的文件下发流程。下面来看看传统的文件下发流程是什......
  • SpringBoot 实现热插拔AOP,非常实用!
    现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自定义一个advice......