C++重载加号运算符返回时遇到的问题

dzz10 2012-03-27 09:32:51
代码如下:
BigNumber BigNumber::operator+( BigNumber& r )
{
Invert(r.data);//倒置
Invert(data);

int len = (int)strlen(data);
int r_len = (int)strlen(r.data);

char* temp = new char[len * r_len];

int b = 0;
for(int i = 0; i < max(len, r_len); i++){
int t = (isOk(*(this->data + i)) - '0') + (isOk(*(r.data + i)) - '0') + b;
if(t >= 10) b = 1;
else b = 0;
*(temp + i) = t % 10 + '0';
}

if(b){
*(temp + max(len, r_len)) = '1';
*(temp + max(len, r_len) + 1) = 0;
}else *(temp + max(len, r_len)) = 0;

Invert(r.data);
Invert(data);
Invert(temp);

BigNumber end(temp);
delete[len * r_len]temp;

return end;//此句要进拷贝构造函数,再进析构函数
}

返回给调用处的data是0XCCCCCCCC。

我就不明白了,在return那里明明拷贝了一个,为什么还是不行呢?
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2012-03-27
  • 打赏
  • 举报
回复
看6,7楼的解释
dzz10 2012-03-27
  • 打赏
  • 举报
回复
你的方法能行,能麻烦你帮我讲解下你的和我的有什么区别吗?
我看着是一样的啊



[Quote=引用 4 楼 pengzhixi 的回复:]
BigNumber::BigNumber( BigNumber& bigNum )
{
data= new char[strlen(bigNum.data)+1];
strncpy(data,bigNum.data,strlen(bigNum.data));
}

大概意思是这样了。
[/Quote]
luciferisnotsatan 2012-03-27
  • 打赏
  • 举报
回复
类似于
BigNumber::BigNumber( BigNumber& bigNum )
{
BigNumber tmp(bigNum.data);
}


实际上什么都没干
luciferisnotsatan 2012-03-27
  • 打赏
  • 举报
回复
BigNumber::BigNumber( BigNumber& bigNum )
{
BigNumber(bigNum.data);
}

你以为红色部分是调用了BigNumber::BigNumber( char* array_num )这个函数,设置data,但实际上是产生了个BigNumber临时对象。


dzz10 2012-03-27
  • 打赏
  • 举报
回复
void BigNumber::Invert( char* str )
{
int len = (int)strlen(str);
for(int i = 0; i < len / 2; i++){
char t = *(str + i);
*(str + i) = *(str + len - i - 1);
*(str + len - i - 1) = t;
}
}

BigNumber::BigNumber( char* array_num )
{
int len = (int)strlen(array_num);
data = new char[len + 1];
strcpy_s(data, len + 1, array_num);
data[len] = 0;
}

BigNumber::BigNumber( BigNumber& bigNum )
{
BigNumber(bigNum.data);
}

[Quote=引用 2 楼 luciferisnotsatan 的回复:]
Invert和BigNumber end(temp);的内容是什么?
[/Quote]
pengzhixi 2012-03-27
  • 打赏
  • 举报
回复
BigNumber::BigNumber( BigNumber& bigNum )
{
data= new char[strlen(bigNum.data)+1];
strncpy(data,bigNum.data,strlen(bigNum.data));
}

大概意思是这样了。
dzz10 2012-03-27
  • 打赏
  • 举报
回复
BigNumber::BigNumber(void)
{
data = NULL;
}

BigNumber::BigNumber( char* array_num )
{
int len = (int)strlen(array_num);
data = new char[len + 1];
strcpy_s(data, len + 1, array_num);
data[len] = 0;
}

BigNumber::BigNumber( BigNumber& bigNum )
{
BigNumber(bigNum.data);
}

BigNumber::~BigNumber(void)
{
if(data)
delete[(int)strlen(data) + 1]data;
data = NULL;
}

貌似是你说的那样样,我才学,不怎么懂。

[Quote=引用 1 楼 pengzhixi 的回复:]
那么你就要考虑是否有深拷贝的问题了。
[/Quote]
luciferisnotsatan 2012-03-27
  • 打赏
  • 举报
回复
Invert和BigNumber end(temp);的内容是什么?
pengzhixi 2012-03-27
  • 打赏
  • 举报
回复
那么你就要考虑是否有深拷贝的问题了。

64,682

社区成员

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

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