C++ 实现mystring类型

本文介绍了一个简单的C++自定义字符串类的设计与实现过程,涵盖了构造函数、析构函数、运算符重载等核心内容,并通过示例展示了如何使用该类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const int MS=100;
class mystring{
	char *str;        //存放字符串的数组容器
	int maxsize;          //最大可用元素数,可防止数组出界,提高健壮性
	int last;              //已用元素最大下标
public:
	mystring();
	mystring(char *s);
	mystring(mystring & st);
	~mystring();
	void show();
	char & operator[](int i);

	mystring &operator=(const mystring &);
	mystring & operator=(char * st);//这里重载的=是把C风格字符串赋给mystring
	mystring operator+(mystring &);
	mystring operator+=(mystring &);
	bool operator<(mystring &);
	bool operator==(mystring &);
};
mystring::mystring()
{
		last=0;
		maxsize =MS;
		str=new char[last];
		str[last]=0;
		cout<<"缺省构造函数"<<endl;
}
mystring::mystring(char *s)//当C字符串过长,初始化时采用截尾处理
{
		last=0;
		maxsize =MS;
		str=new char[strlen(s)+1];//s的长度没有包括\0
		do{
			str[last]=s[last];
			last++;
		}while(s[last]!='\0'&&last<maxsize-1);
		str[last] ='\0'; //截尾处理时,必须加串结束符
		cout<<"构造函数"<<endl;
}
mystring::mystring(mystring & st)
{
		last=0;
		maxsize =MS;
		str=new char[st.last+1];//s的长度没有包括\0//重新指向动态内存
		do{
			str[last]=st.str[last];
			last++;
		}while(st.str[last]!='\0'&&last<maxsize-1);
		str[last]='\0';
		cout<<"拷贝构造函数"<<endl;
}
mystring::~mystring()
{
	delete []str;
	str=NULL ;
		cout<<"析构函数"<<endl;
}
void mystring::show(){//如需重载<<,则请参见9.3.3节,暂时未学到,替代方法是用show()函数
		cout<<str<<endl;
}
char & mystring::operator[](int i)
{   //返回引用,可读可写
	//if(i>last){cout<<"access violate!";exit(1);}
	return str[i];
}
mystring &mystring::operator=(const mystring & st){
	if(&st==this)return*this;
	last=st.last;//新的长度
	delete []str;
	str=new char[last+1];
	last=0;
	do{
		str[last]=st.str[last];
		last++;
	}while(st.str[last]!='\0'&& last<maxsize-1);
	str[last] ='\0'; //截尾处理时,必须加串结束符
	return *this;//拷贝的临时变量生命期在调用它的表达式中
}
mystring & mystring::operator=(char* s)
{ //这里返回值为引用,不调用拷贝构造函数
	//delete []str;//这里不能这样??为什么?
	last=0;
	str=new char[strlen(s)+1];//s的长度没有包括\0	
	do{
		str[last]=s[last];
		last++;
	}while(s[last]!='\0'&&last<maxsize-1);
	str[last] ='\0'; //截尾处理时,必须加串结束符
	return *this;
}
mystring mystring::operator+(mystring & st){//注意+和+=的不同
	mystring temp(*this);
	temp.last=temp.last+st.last;//新的长度
	delete []temp.str;
	temp.str=new char[temp.last+1];//申请空间   s的长度没有包括\0
	temp.last =0;
	do{
		temp.str[temp.last]=str[temp.last];
		temp.last++;
	}while(str[temp.last]!='\0'&& temp.last<temp.maxsize-1);
	if(temp.last<temp.maxsize-1)
	{
		int i=0;
		do{
			temp.str[temp.last]=st.str[i];
			temp.last++;
			i++;
		}while(st.str[i]!='\0'&& temp.last<temp.maxsize-1);
	}
	temp.str[temp.last] ='\0'; //截尾处理时,必须加串结束符
	return temp;//拷贝的临时变量生命期在调用它的表达式中
}
mystring mystring::operator+=(mystring & st){//+=在对象自身进行
	mystring temp(*this);
	int i;//保存原来的长度
	last=last+st.last;//新的长度
	delete []str;
	str=new char[last+1];//申请空间   s的长度没有包括\0
	last=0;
	do{
		str[last]=temp.str[last];
		last++;
	}while(temp.str[last]!='\0'&& last<maxsize-1);	
	if(last<maxsize-1)
	{
		i=0;
		do{
			str[last]=st.str[i];
			i++;
			last++;
		}while(st.str[i]!='\0'&& last<maxsize-1);	
	}
	str[last] ='\0'; //截尾处理时,必须加串结束符*/
	return *this;//拷贝的临时变量生命期在调用它的表达式中
}
bool mystring::operator<(mystring & st){   //重载<运算符
	int i=0,k;
	do{
		k=str[i]-st.str[i];
		i++;
	}while(k==0&&i<last&&i<st.last);
	if(k<0) return true;
	if(i==last&&i!=st.last) return true;
	return false;
}
bool mystring::operator==(mystring & st){
	int i=0,k;
	if(last!=st.last) return false;
	do{
		k=str[i]-st.str[i];
		i++;
	}while(k==0&&i<last);
	if(k!=0) return false;
	else return true;
}

int main(){
	int i=0;
	char *sp1="sp1",*sp2="sp2",*sp3="sp3",*sp4="sp4";
	mystring mstr1(sp1);
	mystring mstr2(sp2);
	mystring mstr3(sp3);
	mystring mstr4(mstr3);
	mystring mstr5=mstr3;
	mystring mstr6; 
	mstr6=sp4; //ms6赋值是返回引用,不用拷贝构造函数
	/*cout<<"mstr1:   ";
	mstr1.show();
	cout<<"mstr2:   ";
	mstr2.show();
	cout<<"mstr3:   ";
	mstr3.show();
	cout<<"mstr4:   ";
	mstr4.show();
	cout<<"mstr5:   ";
	mstr5.show();
	cout<<"ms6:   ";
	mstr6.show();
	mstr6=mstr5;
	cout<<"mstr6=mstr5:  ";
	mstr6.show ();
	mstr6=mstr1+mstr2;
	cout<<"mstr6=mstr1+mstr2:  ";
	mstr6.show ();
	mstr3+=mstr4;
	cout<<"mstr3+=mstr4:  ";
	mstr3.show ();
	mstr4=mstr1+mstr2+mstr6;//注意temp和临时变量由拷贝构造函数生成
	cout<<"mstr4=mstr1+mstr2+mstr6:    ";
	mstr4.show();
	mstr1+=mstr2+mstr3;
	cout<<"mstr1+=mstr2+=mstr3:   ";
	mstr1.show();
	if(mstr1<mstr4) {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之前"<<endl;}
	else {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之后"<<endl;}
	mstr6=mstr1;//mstr6赋值不是返回引用,必须调用拷贝构造函数建立临时对象
	if(mstr1==mstr6) cout<<"串mstr1与串mstr6相同"<<endl;
	else cout<<"不相同!"<<endl;
	mstr1="C++ programming language";*/
	i=0;
	while(mstr1[i]!='\0') cout<<mstr1[i++];//读出
	cout<<endl;
	mstr1[i++]='.';//写入
	mstr1.show ();
	i--;
	mstr1[i]='\0';
	mstr1.show();
	mstr1[i]='k';
	mstr1.show();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值