string 类的实现

1.    #include<iostream>  
2.    #include<iomanip>  
3.    using namespace std;  
4.      
5.    class String{  
6.         friend ostream& operator<< (ostream&,String&);//重载<<运算符  
7.         friend istream& operator>> (istream&,String&);//重载>>运算符  
8.    public:  
9.        String(const char* str=NULL);                //赋值构造兼默认构造函数(char)  
10.        String(const String &other);                 //赋值构造函数(String)  
11.        String& operator=(const String& other);       //operator=  
12.        String operator+(const String &other)const;  //operator+  
13.        bool operator==(const String&);              //operator==  
14.        char& operator[](unsigned int);              //operator[]  
15.        size_t size(){return strlen(m_data);};  
16.        ~String(void) {delete[] m_data;}  
17.    private:  
18.        char *m_data; // 用于保存字符串  
19.    };  
20.      
21.    inline String::String(const char* str)     
22.    {  
23.        if(!str)m_data=0;      //声明为inline函数,则该函数在程序中被执行时是语句直接替换,而不是被调用  
24.        else {  
25.            m_data=new char[strlen(str)+1];  
26.            strcpy(m_data,str);  
27.        }  
28.    }  
29.      
30.    inline String::String(const String &other)  
31.    {  
32.        if(!other.m_data)m_data=0;//在类的成员函数内可以访问同种对象的私有成员(同种类则是友元关系)  
33.        else   
34.        {  
35.            m_data=new char[strlen(other.m_data)+1];  
36.            strcpy(m_data,other.m_data);  
37.        }  
38.    }  
39.      
40.    inline String& String::operator=(const String& other)  
41.    {  
42.        if (this!=&other)  
43.        {  
44.            delete[] m_data;  
45.            if(!other.m_data) m_data=0;  
46.            else  
47.            {  
48.                m_data = new char[strlen(other.m_data)+1];  
49.                strcpy(m_data,other.m_data);  
50.            }  
51.        }  
52.        return *this;  
53.    }  
54.    inline String String::operator+(const String &other)const  
55.    {  
56.        String newString;  
57.        if(!other.m_data)  
58.            newString = *this;  
59.        else if(!m_data)  
60.            newString = other;  
61.        else  
62.        {  
63.            newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];  
64.            strcpy(newString.m_data,m_data);  
65.            strcat(newString.m_data,other.m_data);  
66.        }  
67.        return newString;  
68.    }  
69.      
70.    inline bool String::operator==(const String &s)      
71.    {  
72.        if ( strlen(s.m_data) != strlen(m_data) )  
73.            return false;  
74.        return strcmp(m_data,s.m_data)?false:true;  
75.    }  
76.      
77.    inline char& String::operator[](unsigned int e)  
78.    {  
79.        if (e>=0&&e<=strlen(m_data))  
80.            return m_data[e];  
81.    }  
82.      
83.    ostream& operator<<(ostream& os,String& str)  
84.    {  
85.        os << str.m_data;  
86.        return os;  
87.    }  
88.      
89.    istream &operator>>( istream &input, String &s )  
90.    {  
91.       char temp[ 255 ]; //用于存储输入流  
92.       input>>setw(255)>>temp;  
93.       s = temp; //使用赋值运算符  
94.       return input; //使用return可以支持连续使用>>运算符  
95.    }  
原文地址:https://www.cnblogs.com/NeilZhang/p/5312196.html