代码实践——String类

String.h

#include "iostream"
using namespace std;
class String
{
    public:
        String(const String& str);
        String(const char* c);
        ~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;
        char* c_str() const;

        friend ostream& operator<<(ostream&, const String& s);

    private:
        int len;
        char* data;
};

String.cpp

#include "String.h"
#include "string.h"

size_t String::size() const
{
    return len;
}

String::String(const String& str)
{
    this->len = str.size();
    this->data = new char[len + 1];
    strcpy(data, str.c_str());
}

String::String(const char* c)
{
    if (!c)
    {
        len = 0;
        data = new char[1];
        data[0] = '\0';
    }
    else
    {
        len = strlen(c);
        data = new char[len + 1];
        strcpy(data, c);
    }
}

String::~String()
{
    delete []data;
    len = 0;
}

String String::operator+(const String& str) const
{
    char* tmp = new char[len + str.size() + 1];
    strcpy(tmp, this->c_str());
    strcat(tmp, str.c_str());
    return String(tmp);
}

String& String::operator=(const String& str)
{
    this->len = str.size();
    this->data = new char[len + 1];
    strcpy(data, str.c_str());
    return *this;
}

String& String::operator+=(const String& str)
{
    len+=str.size();
    strcat(data, str.c_str());
    return *this;
}

bool String::operator==(const String& str) const
{
    if (len != str.size())
        return false;
    for (int i = 0; i < len; i++)
    {
        if (operator[](i) != str[i])
            return false;
    }
    return true;
}

char String::operator[](int n) const
{
    if (n < 0)
        n = n % len + len;
    if (n >= len)
        return '\0';
    return *(data + n);
}

char* String::c_str() const
{
    char* tmp = new char[len + 1];
    strcpy(tmp, data);
    return tmp;
}

ostream& operator<<(ostream& out, const String& s)
{
    out << s.data;
    return out;
}

以上代码还有很多问题,详见:

C++笔试题之String类的实现

C++中String类的实现

其中赋值操作没有检查自赋值,改成:

String& String::operator=(const String& str)
{
    if (this == &str)
        return *this;
    delete [] data;
    this->len = str.size();
    this->data = new char[len + 1];
    strcpy(data, str.c_str());
    return *this;
}
其他+=也做类似修改即可


猜你喜欢

转载自blog.csdn.net/guangyacyb/article/details/80252230
今日推荐