c++运算符重载Mystring<,<=,>.>=,+,+=

小编犯的错误是:

1. 对象的指针比较大小,要使用strcmp(s1.ptr, s2.ptr);

2. +,+= 运算符重载时,内存需要创建新的空间,建议使用 ”换杯子“ 的方法进行

例题如下:

class MyString{
	char *ptr;
public:
	int size()const{
		return strlen(ptr);
	}
	MyString(){
		ptr=new char[1];
		ptr[0]='\0';
	}
	MyString(const char *p){
		ptr=new char[strlen(p)+1];
		strcpy(ptr,p);
	}
	MyString(const MyString &str){
		ptr=new char[str.size()+1];
		strcpy(ptr,str.ptr);
	}
	~MyString(){
		delete []ptr;
	}
	friend ostream & operator<<(ostream & out,const MyString &str); 
	friend MyString operator+(const MyString &s1,const MyString &s2); 
	friend int operator==(const MyString &s1,const MyString &s2);
	friend int operator!=(const MyString &s1,const MyString &s2);
	friend int operator<(const MyString &s1,const MyString &s2);
	friend int operator<=(const MyString &s1,const MyString &s2);
	friend int operator>(const MyString &s1,const MyString &s2);
	friend int operator>=(const MyString &s1,const MyString &s2);
	MyString & operator=(const MyString &s);
	MyString & operator+=(const MyString &s);
	char operator[](int i);
}; 


对该类重载教材233页表6-1中列出的那些运算符(这些运算符的含义和string类一致)。


main函数也写好了,请根据上面的类声明部分和main函数的内容,将未实现的运算符函数进行实现。main函数如下:

int main(){
	
	MyString s1("Hello"),s2("World"),s3("China");
	cout<<(s1>s2)<<" "<<(s1>=s2)<<" "<<(s1<=s2)<<" "<<(s2<s3)<<endl;
	cout<<(s1==s2)<<" "<<(s1!=s3)<<endl;
	MyString s4=s1+s2;
	cout<<s4<<endl;
	s1=s2=s3;
	cout<<s1<<" "<<s2<<" "<<s3<<endl;
	s4+=s3;
	cout<<s4<<endl;
	for(int i=s4.size()-1;i>=0;i--)
		cout<<s4[i];
	cout<<endl;
	return 0; 
}

正确解答如下:

#include<bits/stdc++.h>
using namespace std;

ostream& operator<<(ostream& out,const MyString &str){
		out<<str.ptr;//输出地址上的内容 
		return out;//01
	}
	MyString operator+(const MyString &s1,const MyString &s2){
		//char *t=s1.ptr;    cuowu
		MyString s3;
		int length=s1.size()+s2.size();
		s3.ptr = new char[length+1];
		strcpy(s3.ptr,s1.ptr);
		strcat(s3.ptr,s2.ptr);
		delete []s1.ptr;
		s3.ptr[length]='\0';
		return s3;//02 
	}
	int operator==(const MyString &s1,const MyString &s2){
		int jug1=strcmp(s1.ptr,s2.ptr);//不可以直接用if(s1.ptr==s2.ptr)
		if(!jug1) return 1;
		else  return 0;//03
	}
	int operator!=(const MyString &s1,const MyString &s2){
		int jug2=strcmp(s1.ptr,s2.ptr);//不可以直接用if(s1.ptr==s2.ptr)
		if(jug2) return 1;
		else return 0;//04
	}
	int operator<(const MyString &s1,const MyString &s2){
		int jug3=strcmp(s1.ptr,s2.ptr);
		if(!jug3) return 1;
		else return 0;//05
	}
	int operator<=(const MyString &s1,const MyString &s2){
		int jug4=strcmp(s1.ptr,s2.ptr);
		if(jug4<=0) return 1;
		else return 0;//06
	}
	int operator>(const MyString &s1,const MyString &s2){
		int jug5=strcmp(s1.ptr,s2.ptr);
		if(jug5>0) return 1;
		else return 0;//07
	}
	int operator>=(const MyString &s1,const MyString &s2){
		int jug6=strcmp(s1.ptr,s2.ptr);
		if(jug6>=0) return 1;
		else return 0;//08
	}
	MyString& MyString::operator=(const MyString &s){//no member functio//
		ptr=new char[s.size()+1];
		for(int i=0;i<s.size();i++){
			ptr[i]=s.ptr[i];
		}
		return *this;
	}
	MyString & MyString::operator+=(const MyString &s){
		 char *tmp=new char[this->size()+1];
		 strcpy(tmp,ptr);//指针的比较、复制要用函数 
		 ptr= new char[this->size()+s.size()+1];
		 strcpy(ptr, tmp);
		 strcat(ptr, s.ptr);
		 delete[] tmp;
		 ptr[size()+s.size()+1] = '\0';
		 return *this;
	
	}
	char MyString::operator[](int i){
		//MyString s1;
		return ptr[i];//返回char类型指针 
	}

输出如下:

//输出如下
0 0 1 0
0 1
HelloWorld
China China China
HelloWorldChina
anihCdlroWolleH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值