为了复习c++知识,简单的实现一个string类,类名为CMyString

环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core)

开发工具:Visual Studio 2015 和 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)

CMyString类的头文件CMyString.h

 #include <iostream>

 #ifndef __C_MY_STRING__
#define __C_MY_STRING__ class CMyString
{
public:
//默认构造函数
CMyString();
//带参数的构造函数
CMyString(const char* str);
//拷贝构造函数
CMyString(const CMyString&);
//析构函数
~CMyString(); //重载赋值运算符
CMyString& operator=(const CMyString&);
CMyString& operator=(const char*);
//重载[]运算符(可修改)
char& operator[](const int);
//重载[]运算符(不可修改)
const char& operator[](const int) const;
//重载==运算符
bool operator==(const CMyString&) const;
//重载!=运算符
bool operator!=(const CMyString&) const;
//重载>运算符
bool operator>(const CMyString&) const;
//重载<运算符
bool operator<(const CMyString&) const;
//重载>=运算符
bool operator>=(const CMyString&) const;
//重载>=运算符
bool operator<=(const CMyString&) const;
//重载<<运算符
friend std::ostream& operator<<(std::ostream&, const CMyString &);
private:
char* m_pdata;
}; #endif // !__C_MY_STRING__

CMyString类的实现文件CMyString.cpp

 #include "CMyString.h"
#include <cstring>
using namespace std; CMyString::CMyString()
{
//创建一个空的data,占一个字节空间
m_pdata = new char[];
m_pdata[] = '\0';
cout << "默认构造函数" << endl;
} CMyString::CMyString(const char * str)
{
if (str)
{
int len = strlen(str);
m_pdata = new char[len+];
strncpy(m_pdata, str, len);
m_pdata[len] = '\0';
}
else
{
//创建一个空的data,占一个字节空间
m_pdata = new char[];
m_pdata[] = '\0';
}
cout << "带参数的构造函数" << endl;
} CMyString::CMyString(const CMyString & inString)
{
int len = strlen(inString.m_pdata);
m_pdata = new char[len +];
strncpy(m_pdata, inString.m_pdata, len);
m_pdata[len] = '\0';
cout << "拷贝构造函数" << endl;
} CMyString::~CMyString()
{
delete[] m_pdata;
m_pdata = nullptr;
cout << "析构函数" << endl;
} CMyString & CMyString::operator=(const CMyString & instring)
{
cout << "重载赋值运算符1" << endl;
//如果是同一个对象,不做处理直接返回
if (this == &instring)
{
return *this;
} //使用入参通过拷贝构造函数创建一个临时对象
CMyString tmpString(instring);
//修改data指针,当函数结束时,tmpString对象过期,将自动调用析构函数,把原来当前对象的data地址释放掉
char* tmpData = tmpString.m_pdata;
tmpString.m_pdata = m_pdata;
m_pdata = tmpData;
return *this;
} CMyString & CMyString::operator=(const char * str)
{
cout << "重载赋值运算符2" << endl;
delete m_pdata;
if (str)
{
int len = strlen(str);
m_pdata = new char[len + ];
strncpy(m_pdata, str, len);
m_pdata[len] = '\0';
}
else
{
//创建一个空的data,占一个字节空间
m_pdata = new char[];
m_pdata[] = '\0';
}
return *this;
} char & CMyString::operator[](const int index)
{
cout << "重载[]运算符(可修改)" << endl;
return m_pdata[index];
} const char& CMyString::operator[](const int index) const
{
cout << "重载[]运算符(不可修改)" << endl;
return m_pdata[index];
} bool CMyString::operator==(const CMyString & inString) const
{
cout << "重载==运算符" << endl;
return !strcmp(m_pdata, inString.m_pdata);
} bool CMyString::operator!=(const CMyString & inString) const
{
cout << "重载!=运算符" << endl;
return strcmp(m_pdata, inString.m_pdata);
} bool CMyString::operator>(const CMyString & inString) const
{
cout << "重载>运算符" << endl;
return (strcmp(m_pdata, inString.m_pdata) > );
} bool CMyString::operator<(const CMyString & inString) const
{
cout << "重载<运算符" << endl;
return (strcmp(m_pdata, inString.m_pdata) < );
} bool CMyString::operator>=(const CMyString & inString) const
{
cout << "重载>=运算符" << endl;
return (strcmp(m_pdata, inString.m_pdata) >= );
} bool CMyString::operator<=(const CMyString & inString) const
{
cout << "重载<=运算符" << endl;
return (strcmp(m_pdata, inString.m_pdata) <= );
} ostream & operator<<(ostream & os, const CMyString & instring)
{
os << instring.m_pdata;
return os;
}

CMystring类的测试文件testCMyString.cpp

 #include <iostream>
#include "CMyString.h" using namespace std;
int main()
{
//带参数的构造函数
const CMyString myString1("abc");
//默认构造函数
CMyString myString2;
//重载赋值运算符2
myString2 = "def";
//默认构造函数
CMyString myString3;
//重载赋值运算符1,(这个类的内部实现是先调用拷贝构造函数生成一个临时变量,再使用临时变量通过把内容给到myString3,再把临时变量析构)
myString3 = myString2;
//拷贝构造函数
CMyString myString4(myString2);
myString3[] = 'e'; cout << myString1 << "\t" << myString2 << "\t" << myString3 << endl;
//由于myString1带了const修饰,因此是不可修改的,调用不可修改的重载[]运算符
cout << myString1[] << endl;
cout << (myString1 != myString2) << endl;
cout << (myString1 == myString2) << endl;
cout << (myString1 < myString2) << endl;
cout << (myString1 <= myString2) << endl;
cout << (myString1 > myString2) << endl;
cout << (myString1 >= myString2) << endl;
return ;
}

VS2015测试结果:

CentOS

编译

g++ -o testCMyString -std=c++0x ./*.cpp

测试结果

一个简单实现的string类的更多相关文章

  1. 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?

    历史溯源 由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP.FTP.POP3.SMTP.Telnet等.早期操作系统UNIX( ...

  2. java使用注解和反射打造一个简单的jdbc工具类

    a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...

  3. 通过一个简单的数据库操作类了解PHP链式操作的实现

    class Model{ public $table; //操作的表; private $opt; //查询的参数; private $pri; //表的主键; private $lastSql; / ...

  4. 一个简单的redis调用类

    能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get ...

  5. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  6. 一个简单的php分页类代码(转载)

    入门级php分页类 原文地址:http://www.xfcodes.com/php/fenye/3608.htm 时间:2015-12-16 20:52:00来源:网络 php分页类. 复制代码代码如 ...

  7. 一个简单的Hibernate工具类HibernateUtil

    HibernateUtil package com.wj.app.util; import org.hibernate.Session; import org.hibernate.SessionFac ...

  8. 一个简单的CI分页类

    [php] view plaincopy <span style="font-size:16px;">/** * * 关于 页码有效性的判断需要加在 控制器中判断,即当 ...

  9. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

随机推荐

  1. 声源定位之2精读《sound localization based on phase difference enhancement using deep neuarl networks》

    2.1.1 题目与摘要 1.为什么要增强IPD? The phase differences between the discrete Fourier transform (DFT) coeffici ...

  2. TensorFlow2.0初体验

    TF2.0默认为动态图,即eager模式.意味着TF能像Pytorch一样不用在session中才能输出中间参数值了,那么动态图和静态图毕竟是有区别的,tf2.0也会有写法上的变化.不过值得吐槽的是, ...

  3. Netty 4 实现一个 NettyClient

    本文章为作者原创,有问题的地方请提出指正. 1.类继承Diagram 2.定义EndPoint类 目前仅仅定义了2个方法,分别用来获取本地或远程服务器的地址. package netty; impor ...

  4. php-7.3.4 configure: error: Please reinstall the libzip distribution

    php-7.3.4 configure: error: Please reinstall the libzip distribution # wget https://libzip.org/downl ...

  5. Un-Error-ASP.NET:无法加载协定为“YlbService.MMSHServicesSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。

    ylbtech-Error-ASP.NET:无法加载协定为“YlbService.MMSHServicesSoap”的终结点配置部分,因为找到了该协定的多个终结点配置.请按名称指示首选的终结点配置部分 ...

  6. redhat 6安装python 3.7.4报错ModuleNotFoundError: No module named '_ctypes' make: *** [install] Error 1

    问题描述: 今天在测试环境中,为了执行脚本,安装下python3命令,在执行make install的时候报错: ModuleNotFoundError: No module named '_ctyp ...

  7. 设置ESXi宿主机开机自动启动虚拟机

    转载于 https://blog.csdn.net/Form_/article/details/71170813 在百度上面找了一圈都是讲ESXi6.0之前的版本,在VMware vSphere Cl ...

  8. [ERROR] ionic-app-scripts has unexpectedly closed (exit code 1).

    这个错误是因为缺失 '@ionic/app-scripts',只要安装 '@ionic/app-scripts' 即可. 解决方法:npm install @ionic/app-scripts@lat ...

  9. Egret自定义计时器(TimerManager和Laya.timer)

    一 自定义计时器 因为游戏中经常用到计时器,比如每1秒发射一枚子弹啊,每2秒怪物AI自动转向啊 每次去new Timer 然后addEventListener(egret.TimerEvent...  ...

  10. The 10 Best Studio Headphones of 2019

    The 10 Best Studio Headphones of 2019 https://www.outeraudio.com/category/list/ https://www.outeraud ...