小编犯的错误是:
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