一个简单实现的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 ...
随机推荐
- linux安装yasm报错
进入yasm-1.2.0, 输入指令 ./configure //编译yasm make && make install //安装yasm,安装完成即可. 报错信息 make[2]: ...
- 第08组 Beta冲刺(2/4)
队名 八组评分了吗 组长博客链接(2分) 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 12月9号了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任务. 重新分配小组及个 ...
- php提示Notice: Undefined index解决方法
php提示Notice: Undefined index问题,Undefined index:是指你的代码里存在:“变量还未定义.赋值就使用”的错误,这个不是致命错误,不会让你的php代码运行强行中止 ...
- 4款五星级的3D模型资源包
HI,晚上好各位,今晚我们将为大家介绍4款五星级的3D模型资源包. ANIMALS FULL PACK ANIMALS FULL PACK包含了由PROTOFACTOR制作的24款高质量的动物模型,包 ...
- pandas.DataFrame.dropna删除缺失值
https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&courseId=1006383 ...
- linux下如何使用adb连接在qemu中运行的安卓系统?
1. 运行安卓系统, 如下: $sudo qemu-system-x86_64 -m 4096 -boot d -enable-kvm -smp 3 -net nic -net user,hostfw ...
- Embed MP4 in HTML using flash-player(html5 video player)
https://stackoverflow.com/questions/1000851/embed-mp4-in-html-using-flash-player ******************* ...
- 使用filebeat发送nginx日志到kafka
1.配置filebeat_nginx.yml filebeat.modules: - module: nginx access: enabled: true var.paths: ["/va ...
- windows zip命令
针对 Windows 用户的提示: win不自带zip,因此 Windows 用户可以从 GnuWin32 项目页面 上下载zip ,并将 C:\Program Files\GnuWin32\bin( ...
- Rancher容器目录持久化
最近一直在研究Rancher的持久化问题. 目前已找到两种方式实现Rancher里的容器文件实现持久化方法. 方法一: 配置映射(只适用单个文件,不适用于目录) 这个算不上是真正的持久化,只是相当于配 ...