自己的_String类实现

来源:互联网 发布:mac安装win8后无线 编辑:程序博客网 时间:2024/04/28 13:46
//_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==str2hello worldhello world

问题集合:
1.内联函数是定义型,也就是声明部分不加inline,定义部分才加;
2.友元函数是声明型,也就是声明部分加friend,定义不加;
3.最开始使用内联函数定义_String类函数时,使用VS2012编译不通过,报错说是“不可识别符号”,去掉inline就可以了,具体原因不详。。。
4.常对象只能调用常成员函数,所以就有:char* c_str() const;只有这样,长对象才可以找到自己变量。

0 0
原创粉丝点击