C++类的封装之 字符串MyString类

【面试题一的补充】C++ MyString类的封装 一,C++ MyString类的封装 阅读详情

包括了运算符重载<< >> = + == [ ]
mystring.h

#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>
using namespace std;


class MyString
{
    friend ostream& operator<<(ostream& out,MyString& ob);
    friend istream& operator>>(istream& in,MyString& ob);
private:
    char *str;
    int size;
public:
    MyString();
    MyString(const char *str);
    MyString(const MyString& ob);
    ~MyString();
    int Size(void);
    char& operator[](int index);
    MyString& operator=(const MyString &ob);
    MyString& operator=(const char *str);
    MyString& operator+(const MyString &ob);
    MyString& operator+(const char *str);
    bool operator==(const MyString &ob);
    bool operator==(const char *str);
};

#endif // MYSTRING_H

mystring.cpp

#include "mystring.h"
#include <cstring>
#include <iostream>
using namespace std;
MyString::MyString()
{
    this->str=NULL;
    cout<<"无参构造"<<endl;
}

MyString::MyString(const char *str)
{
    cout<<"char *有参构造函数"<<endl;
    this->str=new char[strlen(str)+1];
    strcpy(this->str,str);
    this->size=strlen(str);
}

MyString::MyString(const MyString &ob)
{
    cout<<"拷贝构造函数"<<endl;
    this->str=new char[strlen(ob.str)+1];
    strcpy(this->str,ob.str);
    this->size=ob.size;
}

MyString::~MyString()
{
    cout<<"析构函数"<<endl;
    if(this->str!=NULL)
    {
        delete[] this->str;
        this->str=NULL;
    }
}

int MyString::Size()
{
    return this->size;
}

char& MyString::operator[](int index)
{
    if(index>=0&&index<this->size)
    {
        return this->str[index];
    }
    else
        cout<<"index无效"<<endl;
}

MyString &MyString::operator=(const MyString &ob)
{
    if(this->str!=NULL)
    {
        delete[] this->str;
        this->str=NULL;
    }
    this->str=new char[ob.size+1];
    strcpy(this->str,ob.str);
    this->size=ob.size;
    return *this;
}

MyString &MyString::operator=(const char *str)
{
    if(this->str!=NULL)
    {
        delete[] this->str;
        this->str=NULL;
    }
    this->str=new char[strlen(str)+1];
    strcpy(this->str,str);
    this->size=strlen(str);
    return *this;
}

MyString& MyString::operator+(const MyString &ob)
{
    int newsize=this->size+ob.size+1;//两个字符串的总长度
    char *tmp_str=new char[newsize];
    memset(tmp_str,0,newsize);
    strcpy(tmp_str,this->str);
    strcat(tmp_str,ob.str);
    static MyString newstring(tmp_str);
    if(tmp_str!=NULL)
    {
        delete[] tmp_str;
        tmp_str=NULL;
    }
    return newstring;
}

MyString &MyString::operator+(const char *str)
{
    int newsize=this->size+strlen(str)+1;//两个字符串的总长度
    char *tmp_str=new char[newsize];
    memset(tmp_str,0,newsize);
    strcpy(tmp_str,this->str);
    strcat(tmp_str,str);
    static MyString newstring(tmp_str);
    if(tmp_str!=NULL)
    {
        delete[] tmp_str;
        tmp_str=NULL;
    }
    return newstring;
}

bool MyString::operator==(const MyString &ob)
{
    if((strcmp(this->str,ob.str)==0)&&(this->size==ob.size))
    {
        return true;
    }
    return false;
}

bool MyString::operator==(const char *str)
{
    if((strcmp(this->str,str)==0)&&(this->size==strlen(str)))
    {
        return true;
    }
    return false;
}
ostream& operator<<(ostream& out,MyString& ob)
{
    out<<ob.str;
    return out;
}
istream& operator>>(istream& in,MyString& ob)
{
    if(ob.str!=NULL)
    {
        delete[] ob.str;
        ob.str=NULL;
    }
    char buf[1024]="";
    cout<<"输入一个字符串: ";
    in>>buf;
    ob.str=new char[strlen(buf)+1];
    strcpy(ob.str,buf);
    ob.size=strlen(buf);
    return in;
}

main.cpp

#include <iostream>
#include"mystring.h"
using namespace std;

int main(int argc, char *argv[])
{
    MyString str1("hahaha");
    cout<<str1<<endl;
    cout<<"size="<<str1.Size()<<endl;

    cin>>str1;
    cout<<str1<<endl;
    cout<<"size="<<str1.Size()<<endl;

    MyString str2("hello class");
    cout<<str2<<endl;
    cout<<str2[1]<<endl;
    str2[0]='H';
    cout<<str2<<endl;
    cout<<"size="<<str2.Size()<<endl;

    MyString str3("hello str3");
    cout <<str3<<endl;
    str3=str2;
    cout <<str3<<endl;

    MyString str4("hello str4");
    cout <<"str4="<<str4<<endl;
    str4="hello string";
    cout <<"str4="<<str4<<endl;

    MyString str5("我爱");
    MyString str6("物联网");
    cout<<(str5+str6)<<endl;;

    MyString str7("我爱学习,");
    cout<<str7+"学习爱我"<<endl;

    MyString str8("hehe");
    MyString str9("haha");
    if(str8 == str9)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }

    if(str8 == "hehe")
    {
        cout<<"相等"<<endl;
        }
    else
    {
        cout<<"不相等"<<endl;
    }
    return 0;
}

MyString类(很全并且编译通过) 这个MyString实现了基本所有的String功能。编写了好久。 立即下载

相关推荐

封装一个,完善字符串,字符串的基本操作

定义一个串类CMyString,建立适当的构造函数 必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载[]),完成串的赋值与合并(重载+)。

MyString(字符串类)实现

一、MyString类的组成 1.1 私有成员 char* data 字符型指针 int length 整型字符串长度 1.2 共有成员 1.2.1 构造与析构函数 MyString() 默认构造 MyString(const int intNum) 整数构造 MyString(const float floatNum) 浮点数构造 MyString(const char* pStr) 一般构造 MyString(const int* pStr) 整型bu...

hdlwyt的博客 4896

C++定义一个MyString类,实现两个字符串相加

定义一个MyString类,实现两个字符串相加。要求定义类的数据成员为字符指针,实现深拷贝函数。 1.理解构造函数与析构函数的含义及特点。 2.掌握构造函数的几种类型。 3.掌握构造函数与析构函数的执行顺序。 4.掌握在继承机制中派生类的构造函数和析构函数的执行顺序。

C++实现MyString

MyString的实现,构造、拷贝构造、等号运输、加号运算、输出流等

XXXTENTAC1ON的博客 2305

C++字符串完全指南—第二部分字符串的封装类

C++字符串完全指南—第二部分字符串的封装类.docx

从零到一:在RK3588 Android12上实战RTL8723DU WiFi蓝牙双模驱动移植

本文详细介绍了在RK3588 Android12系统上实战RTL8723DU WiFi蓝牙双模驱动移植的全过程。从驱动源码获取与修改、系统级集成与编译,到调试与性能优化,提供了完整的解决方案。特别针对USB接口适配、电源管理和蓝牙共存等关键问题给出了具体代码示例,帮助开发者快速完成驱动适配并提升设备稳定性。

weixin_28703489的博客 326

字符串类——MyString类

字符串操作,写了一个自己的string类,小小的练习。 #pragma once #include <iostream> #include <cstring> class MyString { public: MyString(); //默认构造函数 MyString(const char* s); //构造函数 MyString(const MyString& s); //拷贝构造函数 ~MyString(); // 析构函数 MyString& o

程序的魅力 4952

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

c++学习之mystring的简单封装

我们经常利用string类实例化对象来对字符串进行各种操作,string类是一个实用的类,那么对于string类的一些基本操作是如何实现的呢?我们简单的实现一下mystring的封装。首先我们给出类模板:其中主要的操作有:1,构造函数的实现 2,运算符的重载。对于string类的基本实现,我们知道string类是对字符串的操作,因此私有变量是字符指针和字符串的大小这两个成员,用来表示字符。其次就是对于字符指针,在这里我们为字符指针是专门开辟一片空间用来存放字符串的。

qq_61422622的博客 1218

STM32CubeMX HAL实战:JY901S串口数据解析与姿态解算

本文详细介绍了如何使用STM32CubeMX HAL库实现JY901S六轴姿态传感器的串口数据解析与姿态解算。从基础硬件连接到USART3配置,再到数据接收状态机实现和传感器校准方法,最后深入讲解互补滤波与Mahony滤波算法在姿态解算中的应用。通过实战代码演示,帮助开发者快速掌握无人机、机器人等项目中关键姿态数据处理技术。

weixin_28703489的博客 432

数学建模之0—1规划(Python)

目录 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1​ (2)案例2 3、遗传算法—sko-GA包实现 (1)代码 (2)结果 4、PuLp实现 (1)代码 (2)结果 5、致谢 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1 (2)案例2 3、遗传算法—sko-GA包...

weixin_46039719的博客 4112

C++ MyString类的实现

功能要求: 功能1.0 初步实现MyString类(数据属性包括char*list,intlength(字符串长度)) 1.1. 实现构造函数(通过字符串初始化list) 1.2. 析构函数 1.3. 字符串拼接 1.4. 字符串比较大小(实现strcmp功能) 1.5. 子串查找 1.6. 提取某个位置字符 1.7. 输出。 功能2.0 2.1. 流输入>>和流输出<<运算符的重载 2.2. 重载 = 运算符 2.3. 重载 += 运算符 2...

han_lx_的博客 3325

5G/NR 网络切片基本概念(协议版)

26.1 网络切片概念 网络切片是一个概念,可以根据每个客户的要求进行区别对待。通过切片的形式,将不同流量差异化处理,以及可以将资源进行隔离,然后移动网络运营商可以将客户视为属于不同租户类型的客户,每种客户具有不同的服务要求,这些要求根据每个租户根据SLA (Service Level Agreement,服务水平协议)可以使用哪种切片类型进行管理和订阅。 网络切片始终由RAN部分和CN部...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 1万+

C++实现字符串mystring类的封装(难点:赋值运算符函数)

2020年11月10日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】 本文目录1. 引言2. 主文件——main.cpp3. mystring.h4. mystring.cpp参考文献 1. 引言 用C++实现了简单的字符串类封装,实现了字符串赋值、相加、修改、比较等功能。完整工程放在了我的github上,有需要的也可以自取。 github地址:https://github.com/March225/High-frequency-algorithm 2. 主文件——main.cpp /** *

m0_37433111的博客 1057

YOLOv10有效涨点专栏目录 | 包含卷积、主干、检测头、注意力机制、Neck、二次创新、独家创新等上百种创新机制

Hello,各位读者们好本专栏自开设以来已经更新改进教程100余篇其中包含二次创新、独家创新多种改进方法,包含C2f、主干、检测头、注意力机制、Neck多种结构,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv10文档并不能在优快云上传,通过建立交流群的形式在内上传我完整的文件和视频我也会在群内不定期和大家交流回答大家问题。专栏介绍。

Snu77的博客 1万+

ROS从入门到精通0-1:教程导读

ROS概念太多太复杂?ROS从入门到精通系列订阅必看

FRIGIDWINTER的博客 1万+

【C++】类的封装

本篇文章就类的封装,讲到数组类封装,字符串类封装。

2301_80035097的博客 405

Wazuh部署记录

Wazuh是一个免费的开源安全平台,统一了XDR和SIEM功能。它可以保护内部部署、虚拟化、容器化和基于云的环境中的工作负载。Wazuh帮助组织和个人保护其数据资产免受安全威胁。它被全球数千个组织广泛使用,从小型企业到大型企业。443:仪表盘界面访问端口1515:探针连接服务器端口1514:探针回传信息端口以上3个端口必须打开防火墙。

墨痕诉清风的博客 1562

自己写的 string 类

现在很多面试题都是要求写一个String类,主要检查Big 3,也就是主要检查构造函数,析构函数和赋值函数.(不要告诉我你以为是:姚明,麦蒂,阿泰...),这也是很考验基本功的一个题目.我今天自己写了一个MyString类,顺便加上了StrAdd函数用于字符串相加,Get函数用于

coding life 1169

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

02.19 构造函数

代码: 3.封装一个 File 类,拥有私有成员 File* fp ,实现以下功能 File f = "文件名" 要求打开该文件; f.write(string str) 要求将str数据写入文件中; string str = f.read(int size) 从文件中读取最多size个字节,并将读取到的数据返回 ;析构函数 4.封装一个 Mutex 互斥锁类 要求: 构造函数:初始化互斥锁,并选择互斥锁的种类 lock 上锁互斥锁 unlock 解锁互斥锁 析构函数,销毁互斥锁 并且开启一个线

Unique_yt的博客 716

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

7.19 作业

1.自己封装string类。

Remi____的博客 232

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++ 作业 Day04

用 C++ 的 class 封装 C 字符串。模仿 C++ 内置的。

cyan的博客 393

C++ 自定义封装string类

作业

2302_76472078的博客 628

2.19c++练习

string str = f.read(int size) 从文件中读取最多size个字节,并将读取到的数据返回。f.write(string str) 要求将str数据写入文件中。ptr.compare(str) 比较ptr和str是否一样。ptr.swap(str) 交换ptr 和 str的内容。2.封装一个 File 类,用有私有成员。构造函数:初始化互斥锁,并选择互斥锁的种类。需要让以下代码编译通过,并实现对应功能。并且开启一个线程测试该互斥锁。unlock 解锁互斥锁。析构函数,销毁互斥锁。

weixin_56261190的博客 524

作业day5

ptr.copy(str) ptr.append(str) ptr.show() 输出ptr代表的字符串 ptr.compare(str) 比较ptr和str是否一样 ptr.swap(str) 交换ptr 和 str的内容 实现以下功能 mystring str = "hello" mystring ptr = "world" str = str + ptr;封装信号灯集 class Sem{ key_t key int id;封装消息队列 class Msg{ key_t key int id;

m0_58248149的博客 423

C++ day3

"c++"中基本类的简单实现

qq_69454187的博客 164
上一篇: C++之继承和派生
下一篇: C++之多继承和虚继承
Evan_work
博客等级 码龄7年 142粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值