#include<iostream>
#include<cstring>
#include<cassert>
#include<iomanip>

using namespace std;
class String;
istream& operator>>(istream&, String&);
ostream& operator<<(ostream&,const String&);

class String
{
public:
 //构造函数
 //String s1();
 //String s1("abc");
 //String s2(s1);
 String();
 String(const char*);
 String(const String&);
 //析构函数
 ~String();
 //赋值操作
 String& operator=(const char*);
 String& operator=(const String&);
 //等于操作
 bool operator==(const char*);
 bool operator==(const String&);
 //加操作
 String operator+(const String&) const;
 //下标操作
 char& operator[](int);
 //成员操作
 int size(){return _size;}
 char* c_str(){return _string;}
 //记数操作
 int count(const char) const;
private:
 int  _size;
 char *_string;
};

inline String::String()                                    //构造函数
{
 _size=0;
 _string=0;
}

inline String::String(const char* str)                     //构造函数
{
 if(!str)
 {
  _size=0;
  _string=0;
 }
 else
 {
  _size=strlen(str);
  _string=new char[_size+1];
  strcpy(_string,str);
 }
}

inline String::String(const String& str)                  //拷贝构造函数
{
 if(!str._size)
 {
  _size=0;
  _string=0;
 }
 else
 {
  _size=strlen(str._string);
  _string=new char[_size+1];
  strcpy(_string,str._string);
 }
}

inline String::~String()                                  //析构函数
{
 delete[] _string;
}

inline String& String::operator=(const char* str)         //赋值操作
{
 if(!str)
 {
  _size=0;
  delete[] _string;
  _string=0;
 }
 else
 {
  _size=strlen(str);
  delete[] _string;
  _string=new char[_size+1];
  strcpy(_string,str);
 }
 return *this;
}

inline String& String::operator=(const String &str)      //赋值操作
{
 if(this!=&str)
 {
  _size=str._size;
  delete[] _string;
  _string=new char[_size+1];
  strcpy(_string,str._string);
 }
 return *this;
}


inline bool String::operator==(const String &rhs)          //等于操作符重载
{
 if(_size!=rhs._size)
  return false;
 return strcmp(_string,rhs._string)?false:true;
}

inline bool String::operator==(const char *str)            //等于操作符重载
{
 return strcmp(_string,str)?false:true;
}

inline char& String::operator[](int n)                     //下标访问符
{
 assert(n>=0 && n<_size);
 return _string[n];
}

inline int String::count(const char s) const               //记数操作
{
 int tempCount=0;
 for(int i=0;i<_size;i++)
 {
     if(_string[i]==s)
   ++tempCount;
 }
 return tempCount;
}

inline String String::operator+(const String& str) const  //加操作
{
 String tempStr;
 tempStr._size=_size+str._size;
 tempStr._string=new char[tempStr._size+1];
 strcpy(tempStr._string,_string);
 strcat(tempStr._string,str._string);
 return tempStr;
}

inline istream& operator>>(istream &io,String &str)       //输入流
{
 const int limit_string_size =4096;
 char inBuf[limit_string_size];
 io>>setw(limit_string_size)>>inBuf;
 str=inBuf;
 return io;
}

inline ostream& operator<<(ostream &os,String &str)       //输出流
{
 return os<<str.c_str();
}


int main()
{
 String str1="abc";
 String str2="def";
 str1.size();
 cout<<"size :"<<str1.size()<<endl;
 cout<<"b count :"<<str1.count('b')<<endl;
 String str3=str1+str2;
 cout<<str3;      //该处不能为String&,只能为String。见String operator+()和ostream& operator<<(ostream &os,String &str)
 return 0;
}

SO GOOD!