编写String类

 

string.cpp

复制代码
/*
String 类
*/


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 &operatorp[](int n) const;              //重载 []

        size_t size() const;                         // 获取长度
        const char* c_str() const;                   //获取 C 字符段长度
        friend istream& operator>> (istream &is, String &str);  //输入
        friend istream& operator<< (ostream &os, String &str);  //输入
    private:
        char *data;
        size_t length;
}

String::String(const char*str=NULL)
{
    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, str.c_str());
    strcat(newData, str.data);

    delete[] data;
    data = newData;
    return *this;
}

inline String::operator==(const String &str) const
{
    if (length != str.length){
        return false;
    }
    return strcmp(data, str.data) ? false : true;
}

inline char& String::operatorp[](int n) const; 
{
    if (n >= length){
        return data[length-1];
    }
    else{
        data[n];
    }
}

inline size_t String::size() const
{
    return length;
}

const char* String::c_str() const
{
    return data;
}

istream& operator>> (istream &is, String &str){
    char tmp[1000] = {0};
    is >> tem;
    str.length = strlen(tem);
    str.data = new char[str.length + 1];
    strcpy(str.data, tem);
    return is;
}

istream& operator<< (ostream &os, String &str)
{
    os << str.data;
    return os;
}
复制代码

 

posted @   王清河  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示