其实C++实现String类型的核心就是对String类型的"+","[]"等运算符进行重载,从而达到和string类型一样的效果。
#include<iostream>
using namespace std;
class String
{
public:
String(const char* str=nullptr)
{
if (str != nullptr)
{
mystr=new char[strlen(str) + 1];
strcpy(mystr, str);
}
else
{
//这里不用mystr=nullptr,主要是因为,一旦这么做了,之后所有String的成员函数都需要进行mystr!=nullptr的判断了
mystr = new char[1];
*mystr = '\0';
}
}
~String()
{}
String(const String& otherstr)
{
mystr = new char[strlen(otherstr.mystr) + 1];
strcpy(mystr, otherstr.mystr);
}
String& operator=(const String& otherstr)
{
if (&otherstr == this)return *this;
delete[]mystr;
mystr = new char[strlen(otherstr.mystr) + 1];
strcpy(mystr, otherstr.mystr);
return *this;
}
char& operator[](const int index)//str[2]='e';
{
return mystr[index];
}
const char& operator[](const int index)const//获取str[2];
{
return mystr[index];
}
const char* c_str()
{
return mystr;
}
int length()
{
return strlen(mystr);
}
friend ostream& operator<<(ostream& out, const String& str);
friend String operator+(const String str1, const String str2);
class iterator
{
public:
iterator(char* p = nullptr) :istr(p)
{
}
bool operator!=(const iterator& it)
{
return istr != it.istr;
}
void operator++()
{
istr++;
}
char& operator* ()
{
return *istr;
}
private:
char* istr;
};
iterator begin() { return iterator(mystr); }
iterator end() { return iterator(mystr + length()); }
private:
char* mystr;
};
String operator+(const String str1, const String str2)
{
String str;
str.mystr=new char[strlen(str1.mystr) + strlen(str2.mystr) + 1];
strcpy(str.mystr, str1.mystr);
strcat(str.mystr, str2.mystr);
return str;
}
ostream& operator<<(ostream &out,const String &str)
{
out << str.mystr;
return out;
}
int main()
{
String str1("hello");
String::iterator it = str1.begin();
for (; it != str1.end(); ++it)
{
cout << *it;
}
for (char p : str1)
{
cout << p;
}
return 0;
}