一个简单实现的string类

Posted huangwenhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单实现的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 

 

测试结果:

技术图片

 

以上是关于一个简单实现的string类的主要内容,如果未能解决你的问题,请参考以下文章

实现简单的string类

c++简单String类实现

缓存的简单实现方式

简单工厂模式

工厂模式的一个简单实现

Java 实现简单的SQL动态组装工具类