String 类的实现

来源:互联网 发布:视频聚合软件 编辑:程序博客网 时间:2024/06/06 02:12
//String 类的实现#include <iostream>#include <stdio.h>#include <cstring>using namespace std;class String{public:    String(const char *str = NULL); //通用构造函数    String(const String &str); //拷贝构造函数    ~String(); //析构函数    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字符串    friend istream& operator >> (istream &is, String &str); //输入    friend ostream& operator << (ostream &os, String &str); //输出private:    char *data;    size_t  length;};//默认构造函数String::String(const char *str){    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.length;    data = new  char[length + 1];    strcpy(data, str.c_str());    return *this;}String& String::operator +=(const String &str){    length += str.length;    char *newData = new char[length + 1];    strcpy(newData, data);    strcat(newData, str.data);    delete[]data;    data = newData;    return *this;}inline bool String::operator==(const String &str) const{    if (length != str.length);    return strcmp(data, str.data);}inline char& String::operator[](int n) const{    if (n >= length)    {        return data[length - 1]; //错误处理    }    else {        return data[n];    }}inline size_t String::size() const{    return length;}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;}inline const char* String::c_str() const {    return data;}int main(){    String s;    cin >> s;    cout << s;    return 0;}