一个简单实现的string类

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

环境说明:windows 7 64位

开发工具:Visual Studio 2015

CMyString类的头文件CMyString.h

 1 #include <iostream>
 2
 3 #ifndef __C_MY_STRING__
 4 #define __C_MY_STRING__
 5
 6 class CMyString
 7 {
 8 public:
 9     //默认构造函数
10     CMyString();
11     //带参数的构造函数
12     CMyString(const char* str);
13     //拷贝构造函数
14     CMyString(const CMyString&);
15     //析构函数
16     ~CMyString();
17
18     //重载赋值运算符
19     CMyString& operator=(const CMyString&);
20     CMyString& operator=(const char*);
21     //重载[]运算符(可修改)
22     char& operator[](const int);
23     //重载[]运算符(不可修改)
24     const char& operator[](const int) const;
25     //重载==运算符
26     bool operator==(const CMyString&) const;
27     //重载!=运算符
28     bool operator!=(const CMyString&) const;
29     //重载>运算符
30     bool operator>(const CMyString&) const;
31     //重载<运算符
32     bool operator<(const CMyString&) const;
33     //重载>=运算符
34     bool operator>=(const CMyString&) const;
35     //重载>=运算符
36     bool operator<=(const CMyString&) const;
37     //重载<<运算符
38     friend std::ostream& operator<<(std::ostream&, const CMyString &);
39 private:
40     char* m_pdata;
41 };
42
43 #endif // !__C_MY_STRING__

CMyString类的实现文件CMyString.cpp

  1 #include "CMyString.h"
  2
  3 CMyString::CMyString()
  4 {
  5     //创建一个空的data,占一个字节空间
  6     m_pdata = new char[1];
  7     m_pdata[0] = ‘\0‘;
  8 }
  9
 10 CMyString::CMyString(const char * str)
 11 {
 12     if (str)
 13     {
 14         int len = std::strlen(str);
 15         m_pdata = new char[len+1];
 16         std::strncpy(m_pdata, str, len);
 17         m_pdata[len] = ‘\0‘;
 18     }
 19     else
 20     {
 21         //创建一个空的data,占一个字节空间
 22         m_pdata = new char[1];
 23         m_pdata[0] = ‘\0‘;
 24     }
 25 }
 26
 27 CMyString::CMyString(const CMyString & inString)
 28 {
 29     int len = std::strlen(inString.m_pdata);
 30     m_pdata = new char[len +1];
 31     std::strncpy(m_pdata, inString.m_pdata, len);
 32     m_pdata[len] = ‘\0‘;
 33 }
 34
 35 CMyString::~CMyString()
 36 {
 37     delete[] m_pdata;
 38     m_pdata = nullptr;
 39 }
 40
 41 CMyString & CMyString::operator=(const CMyString & instring)
 42 {
 43     //如果是同一个对象,不做处理直接返回
 44     if (this == &instring)
 45     {
 46         return *this;
 47     }
 48
 49     //使用入参通过拷贝构造函数创建一个临时对象
 50     CMyString tmpString(instring);
 51     //修改data指针,当函数结束时,tmpString对象过期,将自动调用析构函数,把原来当前对象的data地址释放掉
 52     char* tmpData = tmpString.m_pdata;
 53     tmpString.m_pdata = m_pdata;
 54     m_pdata = tmpData;
 55
 56     return *this;
 57 }
 58
 59 CMyString & CMyString::operator=(const char * str)
 60 {
 61     delete m_pdata;
 62     if (str)
 63     {
 64         int len = std::strlen(str);
 65         m_pdata = new char[len + 1];
 66         std::strncpy(m_pdata, str, len);
 67         m_pdata[len] = ‘\0‘;
 68     }
 69     else
 70     {
 71         //创建一个空的data,占一个字节空间
 72         m_pdata = new char[1];
 73         m_pdata[0] = ‘\0‘;
 74     }
 75     return *this;
 76 }
 77
 78 char & CMyString::operator[](const int index)
 79 {
 80     return m_pdata[index];
 81 }
 82
 83 const char& CMyString::operator[](const int index) const
 84 {
 85     return m_pdata[index];
 86 }
 87
 88 bool CMyString::operator==(const CMyString & inString) const
 89 {
 90     return !std::strcmp(m_pdata, inString.m_pdata);
 91 }
 92
 93 bool CMyString::operator!=(const CMyString & inString) const
 94 {
 95     return std::strcmp(m_pdata, inString.m_pdata);
 96 }
 97
 98 bool CMyString::operator>(const CMyString & inString) const
 99 {
100     return (std::strcmp(m_pdata, inString.m_pdata) > 0);
101 }
102
103 bool CMyString::operator<(const CMyString & inString) const
104 {
105     return (std::strcmp(m_pdata, inString.m_pdata) < 0);
106 }
107
108 bool CMyString::operator>=(const CMyString & inString) const
109 {
110     return (std::strcmp(m_pdata, inString.m_pdata) >= 0);
111 }
112
113 bool CMyString::operator<=(const CMyString & inString) const
114 {
115     return (std::strcmp(m_pdata, inString.m_pdata) <= 0);
116 }
117
118 std::ostream & operator<<(std::ostream & os, const CMyString & instring)
119 {
120     os << instring.m_pdata;
121     return os;
122 }

CMystring类的测试文件testCMyString.cpp

 1 #include <iostream>
 2 #include "CMyString.h"
 3
 4 using namespace std;
 5 int main()
 6 {
 7     CMyString myString1("abc");
 8     CMyString myString2("bcd");
 9     CMyString myString3(myString2);
10     myString3[2] = ‘e‘;
11
12     cout << myString1 << "\t" << myString2 << "\t" << myString3 << endl;
13     cout << myString1[2] << endl;
14     cout << (myString1 != myString2) << endl;
15     cout << (myString1 == myString2) << endl;
16     cout << (myString1 < myString2) << endl;
17     cout << (myString1 <= myString2) << endl;
18     cout << (myString1 > myString2) << endl;
19     cout << (myString1 >= myString2) << endl;
20     return 0;
21 }

测试结果:

原文地址:https://www.cnblogs.com/huangwenhao/p/11122282.html

时间: 2024-11-05 15:38:15

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

一个简单的参数校验类

当我们写js的重载函数的时候,我们需要判断不同的输入情况. 而,一般我们是根据参数的个数来判断的,但是,常常情况并非如此: function abc(a,b,c) a:string b:number c:boolean 或者 a:string b:string c:number 这两种情况都是参数个数为3,但是参数类型却完全不同.如何的方便的构建一个重载函数呢? 用我的类即可: 类代码(很简短): var Param = { varify: function (oParam, sParamTyp

1——自我实现一个简洁版的String类

在C++中有C没有的string字符串类型,string类型的数据其实是一个指向字符串首地址的指针变量,因此在string类的默认成员函数拷贝构造和赋值运算符的重载就会涉及到深浅拷贝的问题,一不小心要么就是内存泄露要么就是多次释放同一块空间导致程序崩溃,下面就来模拟实现一个简洁版的String类: 既然是指向一个字符串的指针,因此类的成员变量就需要有一个char*类型的指针: #include <iostream> #include <string.h> using namespa

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

PHP实现的一个简单的数据库操作类(修改版)

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $port; private $username; private $password; public $default_db; private $charset;

造轮子:新建一个属于自己的String类

练习造轮子,新建一个属于自己的MyString类 首先来开启检测内存泄漏的函数 在main里添加 _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); 开启内存泄漏检测 int main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); int *p = new int; return

一个简单实用的log类

自己写一些小代码的时候总是用fprintf来写log,感觉这样不太科学,还是写一个通用的简单带log level的log类,以后就拿来复用吧.这个类实现了非常简单的功能:如果指定了log文件path和name创建一个log文件,并将各种level的写入文件中,否则都打印到屏幕,格式如下: [DEBUG] : xxxxx [WARN] : xxxx [MSG] : xxxxx 代码: //--------------log.h---------------------- #ifndef __LOG

一个简单的通用验证类的实现

进园子三年多了,从来都只是看各位大神的文章,而没有写过,今天心血来潮来写一篇,本人水平略浅,写得不好勿见怪,大神勿喷 首先定义一个验证类型枚举,这里只列出最简单的两种验证类型 1 /// <summary> 2 /// 验证类型枚举 3 /// </summary> 4 public enum ValidateType 5 { 6 /// <summary> 7 /// 不为NULL验证 8 /// </summary> 9 NotNullValidate,

编写一个简单的正则表达式工具类

跟着视频的讲解,也亲手敲了这么一个正则表达式的类,感觉很不错,真是温故而知新,本来想把注释写的逼格高一点的,今天晚了有点累,先简单的写一下,有时间了再完善完善. <?php class regexTool{ //内置一些常用的正则表达式 private $validate = array( 'require'   =>  '/.+/', 'email'     =>  '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', 'url'    

一个简单的redis调用类

能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get($key, $json_decode = true) 根据json_decode来判断是否返回字符串或者是数组,默认返回数组 同时定义一个 private $tags = array( 'set'=>'set', 'setx'=>'set', ) 类内部使用魔术方法__call($name,$a