c plus plus的string函数实现

本来可以轻松搞定的,可惜遇到一个暂时解决不了的问题,没有任何提示的崩;

   

#ifndef _MYSTING_h_

#define _MYSTING_h_

/*

                        String;

*/

using namespace std ;

 

/************************************************************************/

/*访函数,好处:相当于闭包,使得函数能够使用绑定的局部变量(成员变量)

                                                                                    用于函数重载时比较清晰

                                                                                    其它(待补充)*/

/************************************************************************/

class Strlen_c

{

public:

             int operator()( const char * cs)

            {

                         if( cs == NULL)

                                     return -1;

                         int len = -1;

                         while ( len ++,* cs ++ != '\0');

                         return len;

            }

             //int operator()(const char *cs,const char *wu);

};

 

class MyString

{

             friend ostream& operator <<( ostream & out , const MyString & string);

             friend istream& operator >>( istream &in, MyString & string);

public:

             MyString();

             MyString( const char * cs);

             MyString( const MyString & ms);

            ~ MyString();

 

             MyString& operator =( const MyString & ms);

             MyString& operator=( const char * cs);

             MyString operator +( const MyString & ms);

             MyString& operator +=( const MyString & ms);

             char operator[]( const int index);

              

             int getSize() const

             /************************************************************************/

             /*关于const成员函数的几点说明:

                const 对象只能访问const成员

                        const成员函数访问数据成员时隐含的this指针const*/

             /************************************************************************/

            {

                         return this-> m_size;

            }

              

             char* getStr() const

            {

                         return this-> m_str; //返回值为一个指针常量;

            }

 

private:

             char * m_str;

             Strlen_c m_strlen;

             int m_size;

};

 

#endif

 

 

cpp实现:

#include "stdafx.h"

 

MyString::MyString ()

{

             m_str = new char[1];

             m_str = '\0';

             m_size = 0;

}

 

MyString::MyString (const char *cs )

{

             if ( cs == NULL)

                         return;

             m_size = m_strlen( cs);

             m_str = new char[ m_size+1];

             char * strTmp = m_str;

             while  ((* strTmp ++ = * cs ++) != '\0');

}

 

MyString::MyString (const MyString &ms )

{

             if ( ms. getSize() > m_strlen( m_str))

            {

                         m_size = ms. getSize();

                         delete m_str;

                         m_str = new char[ m_size+1];

            }

             char * mstmp = ms. getStr();

             char * mtmp = m_str;

             while((* mtmp ++ = * mstmp ++) != '\0');

}

 

MyString::~MyString ()

{

                         delete m_str;

                         m_str = NULL;

}

 

MyString& MyString ::operator=(const MyString &ms )

{

             if( m_size < ms. getSize())

            {

                         m_size = ms. getSize();

                         delete m_str;

                         m_str = new char[ m_size+1];

            }

             char * mstmp = ms. getStr();

             char * mtmp = m_str;

             while ((* mtmp ++ = * mstmp ++) != '\0');

             return * this;

}

 

MyString& MyString ::operator=(const char *cs )

{

             if( m_size < m_strlen( cs))

            {

                         m_size = m_strlen( cs);

                         delete m_str;

                         m_str = new char[ m_size +1];

            }

             const char * cstmp = cs;

             char * mtmp = m_str;

             while((* mtmp ++ = * cstmp ++) != '\0');

             return * this;

}

 

MyString MyString ::operator+(const MyString &ms )

{

             int len = m_size + ms. getSize();

             char * newtmp = new char[ m_size +1];

             char * mstmp = ms. getStr(),* mtmp = m_str,* tmp = newtmp;

             while((* tmp ++ = * mtmp ++) != '\0');

             tmp --;

             while((* tmp ++ = * mstmp ++) != '\0');

             /*MyString newString(newtmp);                         //关于内存释放,做成成员变量等都能实现,但我想不想那么写,大神建议用vector,但那样就是去了这么些的意义

            delete newtmp;                                                    //希望somebody能帮助解决这一问题;

            return newString;*/                                             //只能暂且以为返回局部变量是坚决不允许的;

             return newtmp;

}

 

MyString& MyString ::operator+=(const MyString & ms)

{

            * this = * this + ms;

             return * this;

}

 

char MyString ::operator[](const int index)

{

             if ( index < 0 || index >= m_size)

                         return '\0';

             return m_str[ index];

}

 

ostream& operator <<(ostream &out , const MyString &string )

{

             out << string. getStr();

             return out;

}

 

/************************************************************************/

/* 关于输入流长度的问题暂时没有好的方法解决,

等待以后有能力解决,或者大神们赐教吧*/

/************************************************************************/

istream& operator >>(istream &in ,MyString &str )

{

             //in.read(str.getStr(),4);//读取4个字节到str;

             in. width(100); //限制宽度

             char tmpstr[100];

             in >> tmpstr;

             str = tmpstr;

             return in;

}

 

至于其它的一些重载没有什么代表性,就不一一写出了;

原文地址:https://www.cnblogs.com/fegnze/p/3702394.html