C++运算符重载,该如何处理
C++运算符重载书上看到的运算符重载,自己想写个,就像MFC中的STRING类,a123,b456,ca+b,c123456,
C++运算符重载
书上看到的运算符重载,自己想写个,就像MFC中的STRING类,a="123",b="456",c=a+b,c="123456",样的,碰见了一写问题。
//自己写的处理字符的类
#include "StdAfx.h"
#include "XString.h"
CXString::CXString(TCHAR a[])
{
int l=CXStrlen(a),i;
str=new TCHAR[l];
for(i=0;i<=l;i++)
str[i]=a[i];
}
CXString::CXString()
{
str=new TCHAR[20];
}
void CXString::putstr()
{
int i;
for(i=0;str[i]!='\0';i++)
{
printf("%c",str[i]);
}
}
CXString::~CXString(void)
{
delete []str;
}
CXString operator + (CXString& prestr,CXString& tillstr)
{
TCHAR *nstr=new TCHAR[prestr.my_CXStrlen()+tillstr.my_CXStrlen()];
//memset(nstr,'\0',sizeof(nstr));
int i,j;
for(i=0;i<prestr.my_CXStrlen();i++)
{
nstr[i]=prestr.str[i];
}
j=i;
for(i=0;i<tillstr.my_CXStrlen();i++)
{
nstr[j+i]=tillstr.str[i];
}
nstr[j+i]='\0';
printf("%s",nstr);//为什么只能输出一个字符?而用for str[i]!='\0',可以全部输出
CXString ns(nstr);
delete []nstr;
return ns;
}
int CXString::CXStrlen(TCHAR a[])
{
int i;
for(i=0;a[i]!='\0';i++);
return i;
}
int CXString::my_CXStrlen()
{
int i;
for(i=0;str[i]!='\0';i++);
return i;
}
int _tmain(int argc, _TCHAR* argv[])
{
CXString a(_T("gogo")),b(_T("yeye"));
CXString c;
c=a+b;
c.putstr();
}
程序运行后 显示段地址错误。
[解决办法]
CXString ns(nstr);
delete []nstr;
return ns; //应该是这里返回的局部变量已经析构掉了的!
//建议直接拿到外面去,谁调用谁来delete 不用构造一个临时的对象!很危险的事情
}
[解决办法] 只有一个计算长度的错误,应该比串长多一个字符;
TCHAR 类型应该用_T表示,不过由于VS 编辑器的问题---不能编辑16位UNICODE编码的汉字,只能编辑MBCS汉字---,实际只对英文有用。对汉字没有用。
和缺省构造函数有问题,基本上没有问题.