c++运算符重载有问题

/*6.重载运算符‘+’、‘=’与‘-’用于字符串的连接,其中main函数为:voidmain(){strings1("某某大学"),s3;strings2("计算机学院... /*6. 重载运算符‘+’、‘=’与‘-’用于字符串的连接,其中main函数为:
void main()
{
string s1("某某大学 "),s3;
string s2("计算机学院欢迎您!");
s3=s1+s2;
s3.display();
s3=s1-s2;
s3.display();
}
要求运行结果为:
某某大学 计算机学院欢迎您!
某某大学计算机学院欢迎您!*/
#include<iostream>
#include<string>
using namespace std;
class String
{private:
char *p;
public:

String(char *q)
{p=new char[strlen(q)+1];
strcpy(p,q);
};
String()
{p=0;};
void display();
friend String operator-(String&,String&);
friend String operator+(String&,String&);
String operator=(const String&);
~String()
{delete [] p;};
};
void String::display()
{cout<<p<<endl;}
String operator+(String&x,String&y)
{String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i = 0 , j = 0 , len = 0 ;
while ( x.p[i] != '\0' )
p[len++] = x.p[i++] ;
while ( y.p[j] != '\0' )
p[len++] = y.p[j++] ;
p[len] = '\0' ;
z.p=p;
return z;}
String operator-(String &x,String &y)
{String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i,m;
for(i=0;x.p[i]!=' ';i++)
p[i]=x.p[i];
for(m=0;y.p[m]!='\0';m++)
p[i+m]=y.p[m];
p[i+m]='\0';
z.p=p;
return z;}
String String::operator=(const String&y)
{ p=y.p;
return *this;}
void main()
{
String s1("某某大学 "),s3;
String s2("计算机学院欢迎您!");
s3=(s1+s2);
s3.display();
s3=(s1-s2);
s3.display();
}
调试时一到s3=s1+s2就出错不能进行了,哪位高手解决一下啊?
展开
 我来答
maohuiabc
推荐于2016-06-26 · TA获得超过197个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:142万
展开全部
String String::operator=(const String&y)
{ p=y.p;
return *this;}

赋值运算符重载要让指针成员独立指向一块内存,并复制数据,不应简单复制地址,否则可能引起指针悬挂问题。

补充:你String operator+(String&x,String&y)里面z.p=p后,没有回收旧内存(原z.p指向的内存),是内存泄露,问题很严重

z为局部变量,返回值后,它的内存就回收了,z.p在析构中也回收了;
你赋值语句不申请新内存并复制数据,所以你的s3=(s1+s2);之后s3.p指向了已经回收的内存。

另外 还需要有一个拷贝构造函数String(String&scr);
String(String& src)
{
int len=strlen(src.p)+1;
p=new char[len];
memcpy(p,src.p ,len);
}

修改后:

/*6. 重载运算符‘+’、‘=’与‘-’用于字符串的连接,其中main函数为:
void main()
{
string s1("某某大学 "),s3;
string s2("计算机学院欢迎您!");
s3=s1+s2;
s3.display();
s3=s1-s2;
s3.display();
}
要求运行结果为:
某某大学 计算机学院欢迎您!
某某大学计算机学院欢迎您!*/
#include<iostream>
#include<string>
using namespace std;
class String
{private:
char *p;
public:

String(char *q)

{p=new char[strlen(q)+1];
strcpy(p,q);
};
String(String& src)
{
int len=strlen(src.p)+1;
p=new char[len];
memcpy(p,src.p ,len);
}
String()
{p=0;};
void display();
friend String operator-(String &,String &);
friend String operator+(String&,String&);
String operator=(const String&);
~String()
{delete [] p;};
};
void String::display()
{
cout<<p<<endl;
}
String operator+(String&x,String&y)
{
String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i = 0 , j = 0 , len = 0 ;
while ( x.p[i] != '\0' )
p[len++] = x.p[i++] ;
while ( y.p[j] != '\0' )
p[len++] = y.p[j++] ;
p[len] = '\0' ;
////////////////////
//回收无用内存
delete z.p;
///////////////////
z.p=p;
return z;}
String operator-(String &x,String &y)
{

String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i,m;
for(i=0;x.p[i]!=' ';i++)
p[i]=x.p[i];
for(m=0;y.p[m]!='\0';m++)
p[i+m]=y.p[m];
p[i+m]='\0';
////////////////////
//回收无用内存
delete z.p;
///////////////////
z.p=p;
return z;
}
String String::operator=(const String&y)
{
//////////////////////////
//通过重新分配内存 并复制数据
/////////////////////////
if(p)delete p;
p=new char[strlen(y.p)+1];
memcpy(p,y.p,strlen(y.p));
//p=y.p;
return *this;
}

void main()
{

String s1("某某大学 "),s3;
String s2("计算机学院欢迎您!");
s3=(s1+s2);
s3.display();
s3=(s1-s2);
s3.display();
}
追问
你比一楼更严谨了哈,不过也是一样在重载=时memcpy的长度少了一个……
追答
本来以为因为最后一个是0,不拷也行。不过现在想想确实新内存最后一个好像也不确定,还要谢谢你的提示。

修改如下:String String::operator=(const String&y)
{
//////////////////////////
//通过重新分配内存 并复制数据
/////////////////////////
if(p)delete p;
int len=strlen(y.p)+1;
p=new char[len];
memcpy(p,y.p,len);
//p=y.p;
return *this;
}
神雕侠之父
2011-06-03 · 超过14用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:0
展开全部
#include<iostream>
using namespace std;

class String{
public:
String(const char* str=NULL); //赋值构造兼默认构造函数(char)
String(const String &other); //赋值构造函数(String)
String& operator=(const String&other); //operator=
String operator+(const String &other)const; //operator+
friend String operator-(String &myself, String &other); //operator-
~String(void) {delete[] m_data;}
void display();
private:
char *m_data;
};

String::String(const char* str)
{
if (!str) m_data=0;
else
{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String::String(const String& other)
{
if(!other.m_data) m_data=0;
else
{
m_data=new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
}
}
String& String::operator=(const String& other)
{
if (this!=&other)
{
delete[] m_data;
if(!other.m_data) m_data=0;
else
{
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data,other.m_data);
}
}
return *this;
}
String String::operator+(const String &other)const
{
String newString;
if(!other.m_data)
newString = *this;
else if(!m_data)
newString = other;
else
{
newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];
strcpy(newString.m_data,m_data);
strcat(newString.m_data,other.m_data);
}
return newString;
}

String operator-(String &myself, String &other)
{
String newString;
char destString[100];
int i;
if(!other.m_data)
newString = myself;
else if(!myself.m_data)
newString = other;
else
{
newString.m_data = new char[strlen(myself.m_data)+strlen(other.m_data)+1];
for (i = 0; myself.m_data[i] != ' '; i++)
{
destString[i] = myself.m_data[i];
}
destString[i] = '\0';
strcpy(newString.m_data,destString);
strcat(newString.m_data,other.m_data);
}
return newString;
}

void String::display()
{
cout<< m_data <<endl;
}

int main()
{
String s1("某某大学 "),s3;
String s2("计算机学院欢迎您!");
s3=(s1+s2);
s3.display();
s3=(s1-s2);
s3.display();
return 0;
}
此程序实现了楼主的要求,关于楼主说的错误,其实很简单,z.p=p;这一具有问题,这里z.p是一个野指针,螺柱没有为他开辟空间,因此调试会出错,还有“=”重载不可以向楼主那样写
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tcet030840zxp
2011-06-03 · TA获得超过735个赞
知道小有建树答主
回答量:299
采纳率:0%
帮助的人:96.4万
展开全部
#include<iostream>
using namespace std;
class String
{
private:
char *p;
public:
String(const char *q)
{
p=new char[strlen(q)+1];
strcpy(p,q);
p[strlen(q)]='\0';
}
String(String& src)
{
int length=strlen(src.p)+1;
p=new char[length];
strcpy(p,src.p);
p[strlen(src.p)]='\0';
}
String()
{
p=NULL;
};
void display()const;
friend String operator-(String &,String &);
friend String operator+(String &,String &);
String String::operator=(const String &y)
{
p=new char[strlen(y.p)+1];
strcpy(p,y.p);
p[strlen(y.p)]='\0';
return *this;
}
~String()
{
delete [] p;
}
};
void String::display()const
{
cout<<p<<endl;
}
String operator+(String &x,String &y)
{
String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i = 0 , j = 0 , len = 0 ;
while ( x.p[i] != ' ' )
p[len++] = x.p[i++] ;
while ( y.p[j] != '\0' )
p[len++] = y.p[j++] ;
p[len] = '\0' ;
z.p=p;
return z;
}
String operator-(String &x,String &y)
{
String z;
char *p = new char[strlen(x.p)+strlen(y.p)+1] ;
int i,m;
for(i=0;x.p[i]!='\0';i++)
p[i]=x.p[i];
for(m=0;y.p[m]!='\0';m++)
p[i+m]=y.p[m];
p[i+m]='\0';
z.p=p;
return z;
}
void main()
{
String s1("某某大学 "),s3;
String s2("计算机学院欢迎您");
s3=(s1+s2);
s3.display();
s3=(s1-s2);
s3.display();
getchar();
}
建议楼主这么改
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式