您的位置:首页 > 其它

string类的实现

2015-07-12 20:28 288 查看
class String

{

public:

     String(const char*str = NULL);// 普通构造函数

     String(const String &other);    // 拷贝构造函数

     ~ String(void);    // 析构函数

     String & operate =(const String &other);// 赋值函数

    String operator+(const String&other)const;//operator+ 

    bool operator==(const String&);            //operator== 

char&operator[](unsigned int);             //operator[]

friendostream& operator<< (ostream&,String&);//<<

friendostream& operator>> (ostream&,String&);

size_tsize(){return strlen(m_data);}; 

private:

     char *m_data;// 用于保存字符串

};

 

//普通构造函数

String::String(const char *str)

{

        if(str==NULL)

        {

                m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断

                *m_data = '\0';

        }   

        else

        {

         int length = strlen(str);

         m_data = new char[length+1]; // 若能加 NULL 判断则更好

         strcpy(m_data, str);

        }

}

 

//String的析构函数

String::~String(void)

{

        delete [] m_data; // 或delete m_data;

}

 

//拷贝构造函数

String::String(const String &other)    // 得分点:输入参数为const型

{     //对other.m_data==NULL判断更好,因为strlen(NULL)会崩溃

        int length = strlen(other.m_data);

        m_data = new char[length+1];     //加分点:对m_data加NULL 判断

        strcpy(m_data, other.m_data);   

}

 

//赋值函数

String& String::operate =(const String &other) // 得分点:输入参数为const

 



{    

        if(this ==&other)                    //得分点:检查自赋值

                return *this;  

        delete [] m_data;                //得分点:释放原有的内存资源

        int length = strlen( other.m_data );     

        m_data = new char[length+1];  //加分点:对m_data加NULL 判断

        strcpy( m_data, other.m_data );  

        return *this;             //得分点:返回本对象的引用 

 

}

//赋值函数一种更好的写法

String& String::operate =(const String &other) // 得分点:输入参数为const

 



{    

        if(this !=&other)                    //得分点:检查自赋值

        {

            String strTemp(other);//创建一个临时对象,if语句执行完后对象自动销毁

           

            Char *pTemp=strTemp.m_data;

            strTemp.m_data=m_data;

            m_data=pTemp

        }

 

        return *this;             //得分点:返回本对象的引用 

 

}

 

//运算符 +

inlineString String::operator+(const String &other)const 



    String newString; 

    if(!other.m_data) 

        newString = *this; 

    else if(!m_data) 

        newString = other; 

    else 

    { 

        newString.m_data = newchar[strlen(m_data)+strlen(other.m_data)+1]; 

        strcpy(newString.m_data,m_data); 

       strcat(newString.m_data,other.m_data); 

    } 

    return newString; 



 //运算符==

boolString::operator==(const String &str) 



    return strcmp(m_data,str.m_data) == 0; 



//运算符[]

inlinechar& String::operator[](unsigned int e) 



    if(e>=0&&e<=strlen(m_data)) 

        return m_data[e]; 



//运算符<<

ostream&operator<<(ostream& os,String& str) 



    os << str.m_data; 

    return os; 



 //运算符>>

istream&operator>>( istream &input, String &s ) 



   chartemp[ 255 ]; //用于存储输入流 

   input>>setw(255)>>temp; 

   s = temp; //使用赋值运算符 

   return input; //使用return可以支持连续使用>>运算符 



 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string类的实现