c++提供的string类

c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的。

今天我们自己来简单来实现MyString类来模拟 string类能做得一些事情。重载+、[]、==、!=、<<、>> 几个运算符。

写法和自定数组类型重载相关运算符差不多,多了一个+ 拼接运算符重载。

代码展示

MyString.h

#pragma once
#ifndef __MY_STRING_H__
#define __MY_STRING_H__
#include <iostream>
using namespace std;class MyString
{
public:MyString();MyString(int len);MyString(const char* str);//拷贝构造函数MyString(const MyString &another);friend ostream& operator<<(ostream &cout, MyString& myString);friend istream& operator >> (istream &cin, MyString& myString);MyString& operator=(const MyString& another);char& operator[](int index);bool operator==(MyString& another);bool operator!=(MyString& another);MyString operator+(const MyString& myString);~MyString();private:int length;//实际字符个数char* str;
};
#endif // !__MY_STRING_H__

MyString.cpp

#include "MyString.h"MyString::MyString()
{this->length = 0;this->str = NULL;
}MyString::MyString(int len)
{//cout << "构造函数 MyString::MyString(int len)...." << endl;this->length = len;this->str = new char[len];//初始位空串memset(this->str, 0, len);
}
MyString::MyString(const char* str)
{//cout << "构造函数 MyString::MyString(const char* str)...." << endl;if (str == NULL){this->length = 0;this->str = new char[1];strcpy(this->str, "");return;}this->length = strlen(str);this->str = new char[this->length + 1];strcpy(this->str, str);}
//初始化时调用
MyString::MyString(const MyString & another)
{//cout << "拷贝构造函数 MyString::MyString(const MyString & another)...." << endl;this->length = another.length;this->str = new char[this->length+1];strcpy(this->str, another.str);
}MyString & MyString::operator=(const MyString & another)
{//cout << "赋值运算符 MyString & MyString::operator=(const MyString & another)...." << endl;// 防止自身赋值if (this == &another){return *this;}// 如果自身原来有空间,先释放if (this->str != NULL){delete[] this->str;this->str = NULL;this->length = 0;}// 新开辟空间进行内容拷贝this->length = another.length;this->str = new char[this->length + 1];strcpy(this->str, another.str);return *this;
}char& MyString::operator[](int index)
{return (this->str[index]);
}bool MyString::operator==(MyString & another)
{if (this == &another){return true;}if (this->length != another.length){return false;}if (strcmp(this->str, another.str) != 0){return false;}return true;
}bool MyString::operator!=(MyString & another)
{return !(*this==another);
}MyString MyString::operator+(const MyString& another)
{int len = this->length + another.length + 1;MyString str1(len);strcat(str1.str, this->str);strcat(str1.str, another.str);return str1;
}MyString::~MyString()
{//cout << "~MyString()" << endl;if (this->str != NULL){delete[] this->str;this->str = NULL;this->length = 0;}
}ostream & operator<<(ostream & cout, MyString & myString)
{if(myString.str!=NULL)cout << myString.str;return cout;
}istream & operator >> (istream & cin, MyString & myString)
{// 如果原来有字符串,将其清空if (myString.str != NULL){delete[] myString.str;myString.str = NULL;myString.length = 0;}//输入长度未知,用临时变量接收,然后进拷贝char temp[1024] = { 0 };cin >> temp;int len = strlen(temp);myString.length = len;myString.str = new char[len + 1];//注意:如果目标空间大于等于源字符串strcpy会复制到\0strcpy(myString.str, temp);return cin;
}

MyStringMain.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include "MyString.h"
using namespace std;int main(int argc, char *argv[])
{MyString str1("hello");//构造函数MyString str2("world");//构造函数//cout << str1 << str2 << endl;MyString str3 = str1;//调用拷贝构造函数cout << str3 <<endl;str3 = str2;// = 调用赋值运算符cout << str3 << endl;MyString str4 = str1 + str2;cout << str4 << endl;cout << "请重置str1和str2:";cin >> str1 >> str2;str4 = str1 + str2;cout << str4 << endl;MyString aa("aaa");MyString bb("aaa");cout <<"aa = " << aa<< ",bb = "<< bb <<",aa==bb:" << boolalpha << (aa == bb) <<endl;return 0;
}

运行结果

C++ 自定义string类 重载相关运算符相关推荐

  1. Java String类的相关操作

    Java String类的相关操作 一.如何遍历字符串 //法一 String str="hello world"; for(int i=0;i<str.length();i ...

  2. c++string类的相关操作

    string的应用是非常典型的,下面我写了一些简单的string类的相关的一些操作,包括增删查改等一些功能和一些运算符的重载,包括他们的测试用例: #include<iostream> # ...

  3. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

  4. C++实现:自定义数组类型实现相关运算符重载

    运算符重载说明 这次我们通过来自定义数组类型重载[].<<.>>.==.!=运算符来学习C++运算符重载相关知识. C++的运算符重载是C++相对于其他编程语言的一大特色. 在 ...

  5. python中mod运算符_自定义 Python 类中的运算符和函数重载(上)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 f ...

  6. string类的相关知识及部分操作

    文章目录 string对象的初始化 string::size_type类型 string对象的读写操作 使用标准库中的iostream 使用getline读取一整行 string对象的比较操作 str ...

  7. 【JAVA中String类的相关知识】

    文章目录 一.创建字符串 1.1创建字符串时的内存布局 二.字符串比较相等 2.1equals方法 三.字符串常量池 3.1实例化操作的内存布局 3.2intern手动入池 四.理解字符串不可变 4. ...

  8. C++ ------------------- string类介绍

    这几天看了Bruce所著<Thinking in C++>一书中有关string类的介绍,结合之前收集到的一些相关资料,这里做个系统的总结,希望能和大家在C++的大路上共同前行. 在C语言 ...

  9. 【C++入门】C++ string类

    C++string类 文章目录 C++string类 一.string基本概念 二.string初始化 (1)构造函数 (2)默认构造函数 (3)复制构造函数 三.string的输入输出 (1)输入 ...

最新文章

  1. linux 某个文件打不开了,linux操作系统下,exe文件为什么打不开?
  2. java中接口的定义与实现
  3. 吃透Java中的动态代理
  4. opencv Remap 图像的映射
  5. 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐
  6. oracle主从表分离怎么实时更新数据_高可用数据库主从复制延时的解决方案
  7. [html] input上传图片怎样触发默认拍照功能?
  8. maven 私服 nexus3 settings.xml
  9. 云服务器 ECS(CentOS) 安装 Node
  10. SLF4J 与Log4J
  11. 计算机系统-电路设计06-振荡器的内部电路实现
  12. 建立矩阵 reshape函数,pascal函数,magic函数,diag函数【Matlab】
  13. 公司内外网同时使用方法
  14. STM8L 库下载地址
  15. GAMES101-现代计算机图形学入门-闫令琪 - lecture6 光栅化2(抗锯齿) - 课后笔记
  16. 【SeedCoder2015年 热身题5 搜索】上上下下ABAB (题目+答案)
  17. 美国大学倒闭危机!1/4高校或将破产,清华本科留学率下降
  18. 综述:基于影像基因组学的肺癌诊断治疗方法研究
  19. 串口调试小节之五 串口参数设置查询
  20. Vue+vant使用uploader上传图片

热门文章

  1. 格雷码、二进制码、BCD编码
  2. 《信息学奥赛一本通》1283:登山
  3. div固定大小文字溢出自动缩小_Figma 教程 | 文字工具
  4. 如何获取exception的target异常_三个好习惯,帮你写好Python里的异常处理
  5. JS逆向笔记-记录某测试论坛的js逆向练习
  6. TCP/IP文档阅读笔记-TCP Receive Window
  7. Linux笔记-shell遍历数组并判断是否等于某个值
  8. 数组指定位置添加元素_数据结构--顺序表的9种基本运算,初始化,销毁,判断是否为空表,长度,求指定位置的元素值......
  9. centos8 装docker 问题
  10. shell与python的优劣_论python 和 shell的实用性