一个简单实现的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 }

测试结果:

猜你喜欢

转载自www.cnblogs.com/huangwenhao/p/11122282.html