1 #include <iostream>
2 #include <string>
3 using namespace std;
4
5 class String
6 {
7 public:
8 String(const char* str = NULL);//通用构造函数,String("abc")
9 String(const String &str);//拷贝构造
10 ~String();
11
12 String& operator=(const String &str);//赋值运算符。返回引用
13 String operator+(const String &str) const;
14 String& operator+=(const String &str);//+=操作符。返回引用
15 char& operator[](int n) const;//下标操作符。返回引用
16 bool operator==(const String &str) const;
17
18 int size() const;//字符串实际大小,不包括结束符
19 const char *c_str() const;//将string转为char *
20
21 private:
22 char *data;
23 int length;
24 };
25
26 String::String(const char* str)//通用构造
27 {
28 if (!str)
29 {//为空。String a()
30 length = 0;
31 data = new char[1];
32 *data = '\0';
33 }
34 else
35 {
36 length = strlen(str);
37 data = new char[length + 1];
38 strcpy(data, str);//会拷贝源的结束符
39 }
40 }
41
42
43 String::String(const String &str)//拷贝构造,深拷贝
44 {
45 length = str.size();
46 data = new char[length + 1];
47 strcpy(data, str.c_str());
48 }
49
50 String::~String()
51 {
52 delete[] data;
53 length = 0;
54 }
55
56 String& String::operator=(const String &str)//赋值操作符4步
57 {
58 if (this == &str) return *this;//1 自我赋值,返回自身引用
59
60 delete[] data;//2 删除原有数据
61
62 length = str.size();//3 深拷贝
63 data = new char[length + 1];
64 strcpy(data, str.c_str());
65
66 return *this;//4 返回自身引用
67 }
68 String String::operator+(const String &str) const//+操作符3步
69 {//新建对象包括新空间,拷贝两个数据,返回新空间
70 String newString;
71 newString.length = length + str.size();
72 newString.data = new char[newString.length + 1];
73 strcpy(newString.data, data);
74 strcat(newString.data, str.data);
75 return newString;
76 }
77
78 String& String::operator+=(const String &str)//+=操作符5步
79 {//重分配新空间,拷贝两个数据,删除自己原空间,赋值为新空间,返回引用
80 length += str.size();//成员length是实际长度
81 char *newdata = new char[length + 1];
82 strcpy(newdata, data);
83 strcat(newdata, str.c_str());
84 delete[] data;
85 data = newdata;
86 return *this;
87 }
88
89 char& String::operator[](int n) const
90 {//下标操作符,返回引用
91 if (n >= length) return data[length - 1];//如果越界,返回最后一个字符
92 else return data[n];
93 }
94
95 bool String::operator==(const String &str) const
96 {
97 if (length != str.size()) return false;
98 return strcmp(data, str.c_str()) ? false : true;
99 }
100
101 int String::size() const
102 {
103 return length;
104 }
105
106 const char *String::c_str() const
107 {
108 return data;
109 }
110
111 int main()
112 {
113 char a[] = "Hello", b[] = "World!";
114 String s1(a), s2(b);
115 cout << s1.c_str() << endl;
116 cout << s2.c_str() << endl;
117 s1 += s2;
118 cout << s1.c_str() << endl;
119 s1 = s2;
120 cout << s1.c_str() << endl;
121 cout << (s1 + s2).c_str() << endl;
122 cout << s1.size() << endl;
123 cout << s1[1] << endl;
124
125 if (s1 == s2)
126 cout << "相等" << endl;
127 }