模拟实现C++提供的string类的代码
提供的方法:
bool operator>(const String& rhs)
bool operator<(const String& rhs)
bool operator==(const String& rhs)
int length()
char c_str()* string—>char*
char& operator[](int index)
const char& operator[](int index) const
String operator+(const String& lhs, const String& rhs)
ostream& operator<<(ostream& out, const String& str)
#include <iostream>
using namespace std;
class String
{
public:
String(const char* str=nullptr)
{
if (nullptr != str)
{
_pstr = new char[strlen(str) + 1];
strcpy(_pstr, str);// 别忘了拷贝啊。。。。
}
else
{// 避免构造对象后底层的_pstr可能为nullptr的情况
_pstr = new char[1];
*_pstr = '\0';
}
}
~String()
{
delete[]_pstr;
_pstr = nullptr;
}
// 拷贝构造列表
String(const String& rhs)// 需要进行深拷贝
{
_pstr = new char[strlen(rhs._pstr) + 1];
strcpy(_pstr, rhs._pstr);
}
// 赋值运算符重载函数,需要进行深拷贝
String& operator=(const String& rhs)
{
if (this == &rhs)
return *this;
delete[]_pstr;
_pstr = new char[strlen(rhs._pstr) + 1];
strcpy(_pstr, rhs._pstr);
}
bool operator>(const String& rhs) const
{
return strcmp(_pstr, rhs._pstr)>0;
}
bool operator<(const String& rhs) const
{
return strcmp(_pstr, rhs._pstr) < 0;
}
bool operator==(const String& rhs) const
{
return strcmp(_pstr, rhs._pstr) == 0;
}
// 返回字符串有效长度
int length()const
{
return strlen(_pstr);
}
// 返回引用,支持对字符串内容进行修改
char& operator[](/* String* this, */int index)
{
return _pstr[index];
}
// 常对象通过[]运算符重载函数返回的字符不能被修改
const char& operator[](/* const String* this, */int index) const
{
return _pstr[index];
}
char* c_str()
{
return _pstr;
}
private:
// string底层维护一个动态开辟的数组
char* _pstr;
friend String operator+(const String& lhs, const String& rhs);
friend ostream& operator<<(ostream& out, const String& str);
};
// 全局+运算符重载,对于String来说,+执行的是拼接操作
String operator+(const String& lhs, const String& rhs)
{
String tmp;
tmp = new char[strlen(lhs._pstr) + strlen(rhs._pstr) + 1];
strcpy(tmp._pstr, lhs._pstr);
strcat(tmp._pstr, rhs._pstr);
return tmp;
}
// 输出运算符重载函数
ostream& operator<<(ostream& out, const String& str)
{
out << str._pstr;
return out;
}
int main()
{
String str1;
/**/
String str2 = "aaa"; // 调用了构造函数String(const char* ptr = nullptr)
String str3 = "bbb";
String str4 = str2 + str3;
String str5 = str2 + "ccc";
String str6 = "ddd" + str2;
cout << "str6: " << str6 << endl;
if (str5 > str6)
{
cout << str5 << ">" << str6 << endl;
}
else
{
cout << str5 << "<" << str6 << endl;
}
int len = str6.length();
for (int i = 0; i < len; i++)
{
// str6.operator[](i)
cout << str6[i] << " ";
}
cout << endl;
// string -> char*
char buf[1024] = { 0 };
strcpy(buf, str6.c_str());
cout << "buf: " << buf << endl;
return 0;
}