c++简单String类实现

  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 }
posted @ 2021-02-26 00:58  天哥的小屋  阅读(88)  评论(0)    收藏  举报