#include
#include
using namespace std;
class String
{
private:
char *s;
int length;
public:
String (char * p=NULL);
String (int a);
String (String &a);
~String();
String operator +(const String &a);
void operator =(const String &a);
bool operator <(const String &a);
friend ostream& operator<< (ostream& out ,const String &a)
{
for(int i=0;i{
cout<}
return cout;
}
friend istream& operator>> (istream& in ,const String &a)
{
for(int i=0 ;i{
cin>>a.s[i];
}
return cin;
}
};
String::String (int a)
{
length=a;
s=new char[length+1];
}
String::String(char *p)
{
if(p)
{
length=strlen(p);
s = new char[length+1];
strcpy(s,p);
}
}
String::String(String &a)
{
s = new char[a.length+1];
length = a.length;
strcpy(s,a.s);
}
String::~String()
{
delete[]s;
length=0;
}
String String::operator +(const String &a)
{
int i,j=0;
String temp;
temp.s=new char[length+a.length+1];
for(i=0;i{
temp.s[j]=s[i];
++j;
}
for(i=0;i{
temp.s[j]=a.s[i];
++j;
}
temp.s[j]='\0';
temp.length = length + a.length;
return temp;
}
bool String:: operator <(const String &a)
{
if (lengthreturn true;
else
return false;
}
void String::operator =(const String &a)
{
delete[] s;
length = a.length;
s=new char[a.length+1];
strcpy(s,a.s);
}
int main()
{
String s1("asdfg"),s3("abc"),s2("aaa");
s2 = s1 + s3;
cout<return 0;
}
#include
using namespace std;
class String
{
private:
public:
char *s;
int length;
public:
String (char * p=NULL);
String (int a);
String ::String(const String &a)//复制构造函数
{
s=new char[a.length+1];
length=a.length;
strcpy(s,a.s);
}
~ String();
String operator +(const String &a);
String operator =(const String &a);
bool operator <(const String &a);
friend ostream& operator<< (ostream& out ,const String &a)
{
for(int i=0;i
out<
return out;//return out
}
friend istream& operator>> (istream& in ,const String &a)
{
for(int i=0 ;i
in>>a.s[i];//in>>a.s[i]
}
return cin;
}
};
String ::String (int a)
{
length=a;
s=new char[length+1];
}
String:: String(char *p)
{
if(p)
{
length=strlen(p);
s = new char[length+1];
strcpy(s,p);
}
else
cout<<"unknown"<
String::~String()
{
delete[]s;
length=0;
}
String String::operator +(const String &a)//应该写成+=吧,左操作数都改了
{
int j=0;
char *p=new char[length+a.length+1];
for(int i=0;i
p[j]=s[i];
++j;
}
for(i=0;i
p[j]=a.s[i];
++j;
}
p[j]=0;
delete[]s;
s=p;
length+=a.length;
return *this;
}
bool String:: operator <(const String &a)
{
if (length
else
return false;
}
String String::operator =(const String &a)
{
delete[]s;
s=new char[a.length+1];
length=a.length;//这里忘了更改
strcpy(s,a.s);
return *this;
}
int main()
{
String s1("asdfg"),s3("abc"),s2("aaa");
s2=s1+s3;
cout<
}
追了半天才发现赋值有问题,构建了一个临时对象,然后将这个对象返回给左值。但是这个临时对象撤销的时候把指针s开的数组删除了。用了一个复制构造函数以后就行了。
不过我要吐槽,错误太多了吧,特别是重载输入输出的时候。。。
String String::operator +(const String &a)
{
int j=0;
char *p=new char[length+a.length+1];
for(int i=0;i
p[j]=s[i];
++j;
}
for(int i=0;i
p[j]=a.s[i];
++j;
}
首先你不应该把你的类命名为string,因为String在string库中已经存在,你再命名成他,让系统很难辨认你用的时候用的是谁。你可以用MyString来命名