#include<iostream>
using namespace std;
class String
{
private:
char *s;
int len;
static int count; //静态类成员,类内声明,类外定义
public:
String();
String(const char *p);
~String();
String(const String & st); //拷贝构造函数
String & operator=(const String & st); //赋值运算符1
String & operator=(const char *p); //赋值运算符2
friend String operator+(const String &obj,const String &obj1); //重载+
String & operator+=(const String & st); //重载+=
char &operator[](int a){return s[a];} //重载[]
friend bool operator<(const String &sr,const String & st); //重载<
friend bool operator==(const String &sr,const String & st) //重载==
friend ostream & operator<<(ostream &os,String &st); //重载<<
friend istream & operator>>(istream &is,String &st); //重载>>
void show(){cout<<s<<endl;}
friend void show_count();
};
int String::count=0;
String::String()
{
len=3;
s=new char[len+1];
strcpy(s,"c++");
count++;
cout<<"调用构造函数String()"<<endl;
}
String::String(const char *p)
{
len=strlen(p);
s=new char[len+1];
strcpy(s,p); //不能s=p;因为需要将传递的字符串复制进新申请的内存,s=p只传递了地址
count++;
cout<<"调用构造函数String(const char *p)"<<endl;
}
String::String(const String & st)
{
len=st.len;
s=new char[len+1];
strcpy(s,st.s);
count++;
cout<<"调用复制构造函数String(const String & st)"<<endl;
}
String & String::operator=(const String & st)
{
<span style="color:#ff0000;">if(this==&st)
return *this; //st和*this是同一个对象,省略这两行就将从已释放的内存中拷贝数据</span>
delete []s;
len=st.len;
s=new char[len+1];
strcpy(s,st.s);
//count++; 没这句,赋值运算符不产生新对象,计数不能增加
cout<<"调用赋值运算符String::operator=(const String & st)"<<endl;
return *this;
}
String &String::operator=(const char *p)
{
delete[]s;
len=strlen(p);
s=new char[len+1];
strcpy(s,p);
cout<<"调用赋值运算符String::operator=(const char *p)"<<endl;
return *this;
}
String operator+(const String &obj,const String &obj1)
{
int len=obj.len+obj1.len;
char *s=new char[len+1];
strcpy(s,obj.s);
strcat(s,obj1.s);
String ss(s);
delete []s;
return ss;
}
String& String::operator+=(const String &st)
{
len=len+st.len;
char *temp=s;
s=new char[len+1];
strcpy(s,temp);
strcat(s,st.s);
delete []temp;
return *this;
}
bool operator<(const String &sr,const String & st)
{
return (strcmp(sr.s,st.s)<0);
}
bool operator==(const String &sr,const String & st)
{
return (strcmp(sr.s,st.s)==0);
}
ostream & operator<<(ostream & os,String & st)
{
os<<st.s;
return os;
}
istream & operator>>(istream &is,String &st)
{
char temp[100];
is.get(temp,100);
if(is)
st=temp;
while(is && is.get()!='\n')
continue;
return is;
}
String::~String()
{
delete[] s;
count--;
cout<<"调用析构函数"<<endl;
}
void show_count(){cout<<String::count<<endl;}