首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

[解决办法]


 

引用:
   书上看到的运算符重载,自己想写个,就像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汉字---,实际只对英文有用。对汉字没有用。
和缺省构造函数有问题,基本上没有问题.

热点排行