自己的_String類實現

//_String .h
#include <string.h>
#include <iostream>
using namespace std;
class _String
{
private:
    char *m_data;

public:

    _String(const char* str);
    _String(const _String &other);
    _String& operator=(const _String &other);
    _String operator+(const _String &other) const;
    char& operator[](unsigned int index);
    bool operator==(const _String &other);

    void c_append(char *str);
    char* c_str() const;

    friend std::istream& operator>>(std::istream& is, _String& str);
    friend std::ostream& operator<<(std::ostream& os, _String& str);

    ~_String(void);
};

上面是頭文件,注意標準輸入輸出聲明爲友元函數:

//_String.cpp
#include "stdafx.h"
#include "_String.h"


_String::_String(const char* str=NULL) {
    if(!str) m_data = 0;
    else {
        int i, len = strlen(str)+1;
        m_data = new char[len];

        for(i=0; i<len-1; i++)
            m_data[i] = str[i];
        m_data[i] = '\0';
    }
}
_String::_String(const _String &other) {
    if(!other.c_str()) m_data = 0;
    else {
        char *ostr = other.c_str();
        int i, len = strlen(ostr)+1;
        delete[] m_data;
        m_data = new char[len];
        for(i=0; i<len-1; i++)
            m_data[i] = ostr[i];
        m_data[i] = '\0';
    }
}
_String& _String::operator=(const _String &other) {
    if (this != &other) {
        delete[] m_data;
        if(!other.c_str()) m_data = 0;
        else {
            char *ostr = other.c_str();
            int i, len = strlen(ostr)+1;
            delete[] m_data;
            m_data = new char[len];
            for(i=0; i<len-1; i++)
                m_data[i] = ostr[i];
            m_data[i] = '\0';
        }
    }
    return *this;
}
_String _String::operator+(const _String &other) const {
    if(!m_data)
            return other;
    else if (!other.c_str())
            return *this;
    else {
        _String newString;
        newString.c_append(m_data);
        newString.c_append(other.c_str());
        return newString;
    }
}
char& _String::operator[](unsigned int index) {
    if(index>=strlen(m_data))
            return *m_data;
    return *(m_data+index);
}
bool _String::operator==(const _String &other) {
    if (0 == strcmp(m_data, other.c_str()))
        return true;
    return false;
}
 char* _String::c_str() const {return m_data;}

_String::~_String(void) {delete []m_data;}

void _String::c_append(char *str) {
    if(str) {
        int i ;
        int len;
        if(!m_data) {
            len = strlen(str)+1;
            m_data = new char[len];
            for(i=0; i<len-1; i++)
                m_data[i] = str[i];
            m_data[i] = '\0';
        }
        else {
            int m_len = strlen(m_data);
            int o_len = strlen(str);
            len = m_len + o_len + 1;
            char *temp = new char[len];
            for (i=0; i<m_len; i++)
                temp[i] = m_data[i];
            for (i=0; i<o_len; i++)
                temp[i+m_len] = str[i];

            delete[] m_data;
            m_data = temp;
        }
    }   
}

std::istream& operator>>(std::istream& is, _String& str) {
    is>>str.m_data;
    return is;
}
std::ostream& operator<<(std::ostream& os, _String& str) {
    os<<str.m_data;
    return os;
}

主程序:

//main.cpp

#include "stdafx.h"
#include "_String.h"


int _tmain(int argc, _TCHAR* argv[])
{
    _String str1 = "hello world";
    _String str2(str1);
    if (str1 == str2)
        cout<<"str1==str2"<<endl;
    _String str3 = str1 + str2;
    cout<<str3<<endl;

    system("pause");
    return 0;
}

輸出結果:

str1==str2
hello worldhello world

問題集合:
1.內聯函數是定義型,也就是聲明部分不加inline,定義部分才加;
2.友元函數是聲明型,也就是聲明部分加friend,定義不加;
3.最開始使用內聯函數定義_String類函數時,使用VS2012編譯不通過,報錯說是“不可識別符號”,去掉inline就可以了,具體原因不詳。。。
4.常對象只能調用常成員函數,所以就有:char* c_str() const;只有這樣,長對象纔可以找到自己變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章