自定义String类

#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;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值