string代码实现
#include <cstddef>
#include <iosfwd>
#include <istream>
#include <string.h>
using std::istream;
using std::ostream;
class String {
private:
/* data */
char *data; //字符串
size_t length; //长度
public:
String(const char *str = nullptr); //默认构造函数
String(const String &str); //拷贝构造函数
friend class String;
friend istream &operator>>(istream &is, String &str);
friend ostream &operator<<(ostream &os, String &str);
String operator+(const String &str) const; //重载+
String &operator=(const String &str); //重载=
String &operator+=(const String &str); //重载+=
bool operator==(const String &str) const; //重载==
char &operator[](int n) const; //重载[]
size_t size() const; //获取长度
const char *c_str() const; //获取C字符串
~String();
};
String::String(const char *str = nullptr) { //通用构造函数
if (!str) {
length = 0;
data = new char[1];
*data = '\0';
} else {
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);
}
}
String::String(const String &str) { //拷贝构造函数
length = str.size();
data = new char[length + 1];
strcpy(data, str.c_str);
}
String::~String() {
delete[] data;
length = 0;
}
String String::operator+(const String &str) const //重载+
{
String newString;
newString.length = length + str.size();
newString.data = new char[newString.length + 1];
strcpy(newString.data, data);
strcat(newString.data, str.data);
return newString;
}
String &String::operator=(const String &str) //重载+
{
if (this == &str) {
return *this;
}
delete[] data;
length = str.size();
data = new char[length];
strcpy(data, str.c_str());
return *this;
}
String &String::operator+=(const String &str) //重载+
{
length += str.size();
char *newData = new char[length + 1];
strcpy(newData, data);
strcat(newData, str.c_str());
delete[] data;
data = newData;
return *this;
}
inline bool String::operator==(const String &str) const //重载==
{
if (length != str.size())
return false;
return strcmp(data, str.data) ? false : true;
}
inline char &String::operator[](int n) const //重载[]
{
if (n >= length) {
return data[length - 1]; //错误处理
}
return data[n];
}
inline size_t String::size() const //获取长度
{
return length;
}
inline const char *String::c_str() const //获取C字符串
{
return data;
}
istream &operator>>(istream &is, String &str) //输入
{
char tem[1000]; //简单的申请一块内存
is >> tem;
str.length = strlen(tem);
str.data = new char[str.length + 1];
strcpy(str.data, tem);
return is;
}
ostream &operator<<(ostream &os, String &str) //输出
{
os << str.data;
return os;
}
参考文章
https://www.cnblogs.com/zhizhan/p/4876093.html
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。