读书人

C++运算符重载,该如何处理

发布时间: 2013-09-18 14:17:40 作者: rapoo

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 不用构造一个临时的对象!很危险的事情
}

[解决办法]




引用:
书上看到的运算符重载,自己想写个,就像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];
memset(nstr,_T('\0'),20);
}


void CXString::putstr()
{
int i;
for(i=0;str[i]!=_T('\0');i++)
{
printf(_T("%c"),str[i]);
}
}


CXString::~CXString(void)
{
delete []str;
}

CXString operator + (CXString& prestr,CXString& tillstr)
{
TCHAR *nstr=new TCHAR[prestr.my_CXStrlen()+tillstr.my_CXStrlen()+1];
//memset(nstr,_T('\0'),prestr.my_CXStrlen()+tillstr.my_CXStrlen()+1);
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]=_T('\0');
printf(_T("%s"),nstr);//为什么只能输出一个字符?而用for str[i]!='\0',可以全部输出
CXString ns;
// TCHAR *t =ns.str;
// ns.str = nstr ;
// nstr =t;
swap(ns.str,nstr);
delete []nstr;
return ns;
}

int CXString::CXStrlen(TCHAR a[])
{
int i;
for(i=0;a[i]!=_T('\0');i++);
return i;
}

int CXString::my_CXStrlen()
{
int i;
for(i=0;str[i]!=_T('\0');i++);
return i;
}



int _tmain(int argc, _TCHAR* argv[])
{
CXString a(_T("gogo")),b(_T("yeye"));
CXString c;
c=a+b;
c.putstr();
}


程序运行后 显示段地址错误。


只有一个计算长度的错误,应该比串长多一个字符;
TCHAR 类型应该用_T表示,不过由于VS 编辑器的问题---不能编辑16位UNICODE编码的汉字,只能编辑MBCS汉字---,实际只对英文有用。对汉字没有用。
和缺省构造函数有问题,基本上没有问题.

读书人网 >C++

热点推荐