単純Stringクラスを自分で実現

2322 ワード

stringクラスを自分で実現し、一般的に構造関数を考察し、構造関数、コピー構造関数、賦値演算子、再ロード=、+、==などのコードは以下の通りである.
class String
{
    friend std::ostream& operator<>(istream& is, String& str);

public:
    String(const char* str = NULL);
    ~String(void);

    String(const String& str);
    String& operator=(const String& str);
    String operator+(const String& str);
    bool operator==(const String& str);
    char& operator[](unsigned int e);

    int getLength();

private:
    char *m_data;    
};

String::String(const char* str)
{
    if(str == NULL)
    {
        m_data = new char[1];    //         ‘0’
        *m_data = '\0';
    }
    else
    {
        m_data = new char[strlen(str) + 1];
        strcpy(m_data, str);
    }
}

String::~String()
{
    if(m_data)
    {
        delete[] m_data;
        m_data = NULL;
    }
}

String::String(const String& str)
{
    if(str.data == NULL)
    {
        m_data = NULL;
    }
    else
    {
        m_data = new char[strlen(str.m_data) + 1];
        strcpy(m_data, str.m_data);
    }
}

String& String::operator=(const String& str)
{
    if(this != &str)        //     
    {
        delete[] m_data;
        m_data = NULL;
        
        if(str.m_data == NULL)
            m_data = NULL;
        else
        {
            m_data = new char[strlen(str.m_data) + 1];
            strcpy(m_data, str.m_data);
        }
    }

    return *this;       
}

String String::operator+(const String& str)
{
	String newString;
	if (str.m_data == NULL)
		return *this;
	else if(m_data == NULL)
	{
		newString = str;
	}
	else
	{
		newString.m_data = new char[strlen(str.m_data) + 1 + strlen(m_data) + 1];
		strcpy(newString.m_data, m_data);
		strcpy(newString.m_data, str.m_data);
	}
	return newString;
}

bool String::operator==(const String& str)
{
	if (strlen(m_data) != strlen(str.m_data))
		return false;
	else
	{
		return strcmp(m_data, str.m_data) ? false : true;
	}
}

char& String::operator[](unsigned int e)
{
    if(e >=0 && e <= strlen(m_data))
        return m_data[e];
}

int String::getLength()
{
	return strlen(m_data);
}

ostream& operator<>(istream& is, String& str)
{
    char buffer[4096];
    is >> buffer;
	str.m_data = buffer;
	return is;
}