c++重载+运算符实现两个字符串连接遇到的有关问题
c++重载+运算符实现两个字符串连接遇到的问题
//重载‘+’运算符实现两个字符串的连接
#include<iostream>
#include<string>
using namespace std;
class String
{ int length;
char*s;
public:
String(){ s=NULL;length=0;}
String(char*a){ length=strlen(a);s=new char[length+1];strcpy(s,a);}
~String(){if(s) delete []s;}
String operator+(String &);
String &operator=(String &);
void show(){if(s) cout<<s;else cout<<"空";}
};
int main()
{
char a[10]="abcdef";char b[10]="ghk";
String str1(a),str2(b),str3;
str3=str2+str1;
str1.show();cout<<'+';str2.show();cout<<'=';str3.show();
system("pause");
return 0;
}
String String::operator+(String &a)
{ String temp;
temp.length=strlen(s)+strlen(a.s);
temp.s=new char[temp.length+1];
strcpy(temp.s,s);
strcat(temp.s,a.s);
return temp;
}
String & String::operator=(String &a)
{ length=a.length;
if(s) { delete []s;s=new char[a.length+1];}
else s=new char[a.length+1];
strcpy(s,a.s);
return *this;
}
------解决方案--------------------
当函数返回的时候,是赋值返回值,然后释放所有局部变量
在你重载+的时候,返回值的时候其实返回的不是temp,而是temp的副本,也就是字符串被析构过一次。
debug的时候,return那里按F11可以看见是调用到析构函数里面去的,这也就是为什么你的字符串不见了
------解决方案--------------------
楼主需要知道,你重载的+运算符函数,返回值是值拷贝
需要自定义的拷贝构造函数实现“深拷贝”,否则的话,系统使用默认的浅拷贝,这对有指针成员的类来说,是存在问题的
你加上:
//重载‘+’运算符实现两个字符串的连接
#include<iostream>
#include<string>
using namespace std;
class String
{ int length;
char*s;
public:
String(){ s=NULL;length=0;}
String(char*a){ length=strlen(a);s=new char[length+1];strcpy(s,a);}
~String(){if(s) delete []s;}
String operator+(String &);
String &operator=(String &);
void show(){if(s) cout<<s;else cout<<"空";}
};
int main()
{
char a[10]="abcdef";char b[10]="ghk";
String str1(a),str2(b),str3;
str3=str2+str1;
str1.show();cout<<'+';str2.show();cout<<'=';str3.show();
system("pause");
return 0;
}
String String::operator+(String &a)
{ String temp;
temp.length=strlen(s)+strlen(a.s);
temp.s=new char[temp.length+1];
strcpy(temp.s,s);
strcat(temp.s,a.s);
return temp;
}
String & String::operator=(String &a)
{ length=a.length;
if(s) { delete []s;s=new char[a.length+1];}
else s=new char[a.length+1];
strcpy(s,a.s);
return *this;
}
C++
String
类
------解决方案--------------------
当函数返回的时候,是赋值返回值,然后释放所有局部变量
在你重载+的时候,返回值的时候其实返回的不是temp,而是temp的副本,也就是字符串被析构过一次。
debug的时候,return那里按F11可以看见是调用到析构函数里面去的,这也就是为什么你的字符串不见了
------解决方案--------------------
楼主需要知道,你重载的+运算符函数,返回值是值拷贝
需要自定义的拷贝构造函数实现“深拷贝”,否则的话,系统使用默认的浅拷贝,这对有指针成员的类来说,是存在问题的
你加上:
String(const String &newstr)
{
int length1 = strlen(newstr.s);
s=new char[length1+1];