自己的_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;只有这样,长对象才可以找到自己变量。

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