为了复习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. linux安装yasm报错

    进入yasm-1.2.0, 输入指令 ./configure //编译yasm make && make install //安装yasm,安装完成即可. 报错信息 make[2]: ...

  2. ubuntu17.10 源

    1.保险做法先备份源文件:  cp -i /etc/apt/sources.list /etc/apt/sources.list_backup 2.打开sources.list:   sudo ged ...

  3. docker run 中的privileged参数

    docker 应用容器 获取宿主机root权限(特殊权限-) docker run -d --name="centos7" --privileged=true centos:7 / ...

  4. scrapy爬虫案例:问政平台

    问政平台 http://wz.sun0769.com/index.php/question/questionType?type=4 爬取投诉帖子的编号.帖子的url.帖子的标题,和帖子里的内容. it ...

  5. 【jmeter】使用csv文件生成用户名和密码列表

    介绍 在[jmeter]使用jmeter进行测试-示例 中介绍了jmeter的基本使用,本文将介绍如何使用csv文件生成多个用户名. 应用场景 实际测试中,经常需要模拟多个用户进行负载测试,而用户名和 ...

  6. matlab学习笔记12单元数组和元胞数组 cell,celldisp,iscell,isa,deal,cellfun,num2cell,size

    一起来学matlab-matlab学习笔记12 12_1 单元数组和元胞数组 cell array --cell,celldisp,iscell,isa,deal,cellfun,num2cell,s ...

  7. iOS开发需要哪些设备

    ios开发硬件配置环境 工具:使用到 Xcode 和 iOS SDK(Apple 提供的开发工具). 硬件配置: 首先有一台Mac电脑,然后有一个iDevice——iPhone.iPad.iPod T ...

  8. Redist的主从配置

    Redis的主从复制一般用来在线备份和读写分离,提高服务器的负载能力.主数据库主要进行写操作,而从数据库负责读操作. 主从的配置: 主节点: [root@master ~]# grep -v -E & ...

  9. [Golang] Gin框架学习笔记

    0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...

  10. [转]Ubuntu18.04 主题美化以及常用软件

    原文地址:https://www.jianshu.com/p/7d153a484f72