C++ 学习系列 -- 实现简单的 String

news2024/12/16 6:58:32

1  标准库 std::string

 c++ 中的 std::string 是一个重要的字符串的类, 我们在日常工作中常常与之打交道。

string是C++标准库的重要部分,主要用于字符串处理。使用string库需要在同文件中包括该库 #include<string>

std::string 实际上是 std::basic_string<char>:std::basic_string - cppreference.com

template<typename _CharT, typename _Traits = char_traits<_CharT>,
           typename _Alloc = allocator<_CharT> >
    class basic_string;

typedef basic_string<char>    string;

 代码示例:

#include<iostream>
#include<string>

int main()
{
    std::string ss;
    // Creating a string from const char*
    std::string str1 = "hello";
    char* c_str2 = "world!";
    std::string str2(c_str2);

    // Concatenating strings
    std::string str3 = str1 + " " + str2;

    // Print out the result
    std::cout << str3 << '\n';

    std::cout << str1 << ' ' << str2 << '\n';

    // Accessing an element using subscript operator[]
    std::cout << str1[0] << '\n';
    str1[0] = 'W';
    std::cout << str1 << '\n';

    return 0;
}

输出:

2  自定义 String 代码

// mystring.h

class String
{
public:
    String(char* data = nullptr);
    ~String();

    // copy constructor
    String(const String& str);
    // copy assignment
    String& operator=(const String& str);

    // move constructor
    String(String&& str);
    // move assignmend
    String& operator=(String&& str);

    char* get_c_str() const;

private:
    char* m_data;
};

// mystring.cpp
#include "mystring.h"
#include <stdio.h>
#include<string.h>

String::String(char* data)
{
    if(data)
    {
        m_data = new char[strlen(data) + 1];
        strcpy(m_data, data);
        m_data[strlen(data)] = '\0';
    }
    else
    {
        m_data = new char[1];
        m_data[0] = '\0';
    }
}

String::~String()
{
    delete [] m_data;
}

String::String(const String& str)
{
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
    m_data[strlen(str.m_data)] = '\0';
}

String& String::operator=(const String& str)
{
    if(this == &str)
    {
        return *this;
    }

    delete [] m_data;
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
    return *this;
}

String::String(String&& str):m_data(str.m_data)
{
    str.m_data = nullptr;
}

String& String::operator=(String&& str)
{
    m_data = str.m_data;
    str.m_data = nullptr;
    return *this;
}

char* String::get_c_str() const
{
    return m_data;
}

// main.cpp
#include"mystring.h"
#include<iostream>

std::ostream& operator<<(std::ostream& os, const String& str)
{
     //os << str.get_c_str();
     os << str.get_c_str();
     return os;
}

int main()
{
    String s1("abcde");

    std::cout << s1 << std::endl;

    // copy constructor
    String s2 = s1;
    std::cout << s2 << std::endl;

    String s3("s3");
    s3 = s1; // copy assignment
    std::cout << s3 << std::endl;

    String s4(String("bbb")); // move constructor
    std::cout << s4 << std::endl;

    String s5 = String("sss5"); // move assignment
    std::cout << s5 << std::endl;
   
    return 0;
}

  输出如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源的局域网文件共享工具迎来大更新

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 hello&#xff0c;伙伴们又有几天的时间不见了。 我的文章也要改变一下日更的策略了&#xff0c;变成坚持更…

什么叫应用加速,什么情况需要用到应用加速

应用加速的定义 应用加速依赖节点之间的高速通道、转发集群及智能路由技术&#xff0c;实现各地用户的就近接入&#xff0c;通过高速通道直达源站区域&#xff0c;帮助业务解决用户访问卡顿或者延迟过高的问题。使用高速网络和全球范围内的节点技术&#xff0c;确保传输时间和…

HTML行内元素与块级元素有哪些及区别

文章目录 一、HTML常见的行内元素二、HTML常见的块级元素三、行内元素与块级元素的区别 一、HTML常见的行内元素 最常用的是span&#xff0c;其他还有a、 img、 input、textarea、select、label 还有包括一些文本元素如&#xff1a;br 、b、 strong、sup 、sub、 i、em 、del、…

关于PCIE显卡的电源供电 6pin或 8pin 转接问题

问题背景 市面销售的电源五花八门 非模组电源 有一些只有 68pin&#xff0c;对于 8pin的电源缺少 2pin供电 模组或半模组电源 模组电源可能某些线材丢失半模组电源&#xff0c;如果线材丢失&#xff0c;在默认线材不够的情况下&#xff0c;可能面临跟全模组丢线一样的问题 市…

期末速成数据库极简版【查询】(3)

目录 多表查询 【8】多表连接——内连接 &#x1f642;等值连接 &#x1f642;自然连接 &#x1f642;非等值连接 【9】多表连接——外连接 【10】交叉连接不考 【11】联合查询 【12】扩展多表连接 【13】嵌套查询 &#x1f642; 多表查询 【8】多表连接——内连…

图神经网络简明教程【GNN】

图神经网络&#xff08;GNN&#xff09;是一组在图领域工作的深度学习方法。 这些网络最近已应用于多个领域&#xff0c;包括&#xff1a; 组合优化、推荐系统、计算机视觉—仅举几例。 这些网络还可用于对大型系统进行建模&#xff0c;例如社交网络、蛋白质-蛋白质相互作用网络…

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时&#xff0c;出现服务器变成本地环回口地址&#xff0c;导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…

C语言数据结构-双向链表

文章目录 1 双向链表的结构2 双向链表的实现2.1 定义双向链表的数据结构2.2 打印链表2.3 初始化链表2.4 销毁链表2.5 尾插,头插2.6 尾删,头删2.7 根据头次出现数据找下标2.8 定点前插入2.9 删除pos位置2.10 定点后插入 3 完整代码3.1 List.h3.2 Lish.c3.3 test.c 1 双向链表的结…

博士论文查重【保姆教程】

大家好&#xff0c;今天来聊聊博士论文查重&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 博士论文查重&#xff1a;确保学术诚信的重要环节 引言 博士论文是博士研究生学术研究成果的重要体现&#x…

每日一练2023.12.9—— 矩阵A乘以B【PTA】

题目链接&#xff1a;L1-048 矩阵A乘以B 题目要求&#xff1a; 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列&#xff0c;B有Rb​行、Cb​列&#xff0c;则只有Ca​与Rb​相等时&a…

RTMP流设置超时时间失败

使用FFmpeg(版本是5.0.3&#xff09;将rtmp流作为输入&#xff0c;设置超时时间&#xff08;使用-timeout参数&#xff09;&#xff0c;结果报错&#xff1a;Cannot open Connection tcp://XXX:1935?listen&listen_timeout 通过./ffmpeg -help full 命令查看FFmpeg帮助&am…

js判断是否对象自身为空

文章目录 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 结合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判断一个对象为空&#xff1f; 先上结论&a…

golang开发之个微机器人的二次开发

简要描述&#xff1a; 下载消息中的文件 请求URL&#xff1a; http://域名地址/getMsgFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型…

一文读懂:如何利用JMeter轻松提升系统性能

jemter是一款开源的性能测试工具、纯属记录&#xff0c;方便回忆使用 &#xff08;一&#xff09;、创建线程组 右键添加一个http请求 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程&#xff0c;同…

gitbash下载安装

参考教程 零、下载 官网地址 2.43.0win64 链接&#xff1a;https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取码&#xff1a;7jaq 一、安装 图标组件&#xff08;Additional icons&#xff09;&#xff1a;选择是否创建桌面快捷方式&#xff1b;桌面浏览&#xff08;Win…

spring cloud 修改bootstrap文件的文件名

前言 spring boot 2.1.2.RELEASE spring cloud 默认的启动文件 spring cloud 默认的启动文件为 bootstrap.yml 修改bootstrap文件的文件名 添加参数 --spring.config.locationclasspath:bootstrap.yml或者 --spring.cloud.bootstrap.locationclasspath:bootstrap.yml还可…

JUC包(面试常问)

1. Callable接口 类似于Runnable接口&#xff0c;Runnable描述的任务&#xff0c;不带返回值&#xff1b;Callable描述的任务带返回值。 public class Test {//创建线程&#xff0c;计算12...1000public static void main(String[] args) throws ExecutionException, Interru…

西南科技大学数字电子技术实验三(MSI逻辑器件设计组合逻辑电路及FPGA的实现)FPGA部分

一、实验目的 进一步掌握MIS(中规模集成电路)设计方法。通过用MIS译码器、数据选择器实现电路功能,熟悉它们的应用。进一步学习如何记录实验中遇到的问题及解决方法。二、实验原理 1、4位奇偶校验器 Y=S7i=0DiMi D0=D3=D5=D6=D D1=D2=D4=D7= `D 2、组合逻辑电路 F=A`B C …

Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地

前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…

97基于matlab的改进的带记忆的模拟退火算法求解TSP问题

基于matlab的改进的带记忆的模拟退火算法求解TSP问题&#xff0c;采用多普勒型降温曲线描述迭代过程&#xff0c;在传统算法的基础上增加记忆功能&#xff0c;可测试中国31/64/144以及att48城市的数据&#xff0c;也可自行输入数据进行测试&#xff0c;测试结果基本达到当前最优…