c++重载+运算符实现两个字符串连接遇到的问题

车木艺 2013-08-19 05:31:46
//重载‘+’运算符实现两个字符串的连接
#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;
}
...全文
516 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-08-20
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
lm_whales 2013-08-20
  • 打赏
  • 举报
回复
operator+,友元重载就不会出现这个问题了 你的两个函数格式都是错误的 //-------------- //成员函数重载 Strring operator+(const String &); String &operator=(const String &);
车木艺 2013-08-19
  • 打赏
  • 举报
回复
引用 3 楼 lovekwf 的回复:
楼主需要知道,你重载的+运算符函数,返回值是值拷贝 需要自定义的拷贝构造函数实现“深拷贝”,否则的话,系统使用默认的浅拷贝,这对有指针成员的类来说,是存在问题的 你加上:
 String(const String &newstr)
	{  
		int length1 = strlen(newstr.s);
		s=new char[length1+1];
		length = length1;
		strcpy(s,newstr.s);
	}
就可以了
正解正解。这是知识盲点,书上木有,老师也木有讲。就这一个问题,可让我研究一整天了,现在才找到问题所在。。
车木艺 2013-08-19
  • 打赏
  • 举报
回复
引用 2 楼 huangjiadog 的回复:
当函数返回的时候,是赋值返回值,然后释放所有局部变量 在你重载+的时候,返回值的时候其实返回的不是temp,而是temp的副本,也就是字符串被析构过一次。 debug的时候,return那里按F11可以看见是调用到析构函数里面去的,这也就是为什么你的字符串不见了
是的。。我添加了拷贝构造函数,运行就正常了
早起煮面条 2013-08-19
  • 打赏
  • 举报
回复
楼主需要知道,你重载的+运算符函数,返回值是值拷贝 需要自定义的拷贝构造函数实现“深拷贝”,否则的话,系统使用默认的浅拷贝,这对有指针成员的类来说,是存在问题的 你加上:
 String(const String &newstr)
	{  
		int length1 = strlen(newstr.s);
		s=new char[length1+1];
		length = length1;
		strcpy(s,newstr.s);
	}
就可以了
汪达人 2013-08-19
  • 打赏
  • 举报
回复
当函数返回的时候,是赋值返回值,然后释放所有局部变量 在你重载+的时候,返回值的时候其实返回的不是temp,而是temp的副本,也就是字符串被析构过一次。 debug的时候,return那里按F11可以看见是调用到析构函数里面去的,这也就是为什么你的字符串不见了
max_min_ 2013-08-19
  • 打赏
  • 举报
回复
string类重载的+

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类型的重载

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧