一个简单实现的string类
为了复习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类的更多相关文章
- 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?
历史溯源 由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP.FTP.POP3.SMTP.Telnet等.早期操作系统UNIX( ...
- java使用注解和反射打造一个简单的jdbc工具类
a simple jdbc tools 如有转载和引用,请注明出处,谢谢 1. 定义我们需要的注解 要想实现对数据库的操作,我们必须知道数据表名以及表中的字段名称以及类型,正如hibernate 使用 ...
- 通过一个简单的数据库操作类了解PHP链式操作的实现
class Model{ public $table; //操作的表; private $opt; //查询的参数; private $pri; //表的主键; private $lastSql; / ...
- 一个简单的redis调用类
能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get ...
- 20181015记录一个简单的TXT日志类
20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...
- 一个简单的php分页类代码(转载)
入门级php分页类 原文地址:http://www.xfcodes.com/php/fenye/3608.htm 时间:2015-12-16 20:52:00来源:网络 php分页类. 复制代码代码如 ...
- 一个简单的Hibernate工具类HibernateUtil
HibernateUtil package com.wj.app.util; import org.hibernate.Session; import org.hibernate.SessionFac ...
- 一个简单的CI分页类
[php] view plaincopy <span style="font-size:16px;">/** * * 关于 页码有效性的判断需要加在 控制器中判断,即当 ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
随机推荐
- IT项目经理都需要具备哪些能力
发布时间:05-2009:24优质原创作者 项目经理是IT行业中比较常见的职位,工作职责主要包括三个方面,其一是资源整合任务:其二是沟通协调任务:其三是保障项目的时间周期. 资源整合能力是项目经理的重 ...
- Spring Boot-Error:(3, 32) java: 程序包org.springframework.boot不存在
问题分析 -由于加载的项目没有加载相应的依赖的包文件导致 解决方案 setting 选中图中的设置,点击apply,IDE就会自动下载所需要的包文件
- win10安装grafana
1.下载grafana-6.2.5.windows-amd64.msi 2.以管理员身份打开CMD 3.输入 msiexec /i 程序的完整路径 msiexec /i xxx.msi
- 针对jquery的优化方法,你知道几条
(转)我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来 ====================== ...
- NSIS安装或卸载时检查程序是否正在运行
转载:https://www.cnblogs.com/z5337/p/4766415.html 转载:https://www.gongzi.org/nsisbuildqqstop.html 转载:ht ...
- [转]docx4j实现动态表格(模板式)
原文地址:https://chendd.cn/information/viewInformation/other/257.a 除了前篇文章中讲到的编程式创建表格外,基于模板实现的列表表格也是非常常用或 ...
- SVN 从主干合并到分支库
主干库:平时开发用的库, 分支库:中途需要进行上生产环境的库 分支库的版本从主干库拉过去就行 红色的为分支库. 创建的速度很快. 1.创建好后,在主干库添加一个文件. 2.然后分支库进行合并,这里用e ...
- C++ list运用实例
C++ list运用实例 #include <list> #include <iostream> #include <algorithm> #include < ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(二)使用Onvif协议进行设备RTSP地址获取
背景介绍 EasyNVR最大的优势就是兼容性,通过RTSP协议接入传统网络摄像机.NVR.编码器等,使用RTSP协议接入能兼容市面上绝大多数网络摄像机等源设备,最大程度的提高整体方案的硬件设备的兼容性 ...
- oracle 解决 exp 空表不能导出的问题
原因:oralce_11g 中有个新特性,当表无数据时,不分配 segment,以节省空间,这也就导致了 exp 在导出表时,没有数据的表会被忽略 方法一:我们可以向表中插入数据,在删除,这样数据表就 ...