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__
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 }
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 }