C++,问题重载+号使两个数组相加时为他们的并集,下面的代码错在哪里了?球改正!

#include<iostream>usingnamespacestd;classAdd{int*a;intsize;public:Add(constAdd&B){siz... #include<iostream>
using namespace std;
class Add
{
int*a;
int size;
public:
Add(const Add&B)
{
size=B.size;
a=new int[size];
}
int SIZE(){return size;}
Add(int size=0,int init=0)
{
this->size=size;
a=new int[size];
for(int i=0;i<this->size;i++)
{
a[i]=init;
}

}
Add()
{
a=NULL;
size=0;
}
~Add()
{
delete[]a;
}
void SetValue(int i=0,int value=0)
{
a[i]=value;
}
Add operator+(const Add&obj);
void Show();
};
Add Add::operator +(const Add&obj)
{
if(obj.a)
{
Add C;
C.size=size+obj.size;
C.a=new int [C.size];
for(int i=0;i<size;i++)
{
C.a[i]=a[i];
}
for(int j=0;j<obj.size;j++)
{
C.a[i+j]=obj.a[j];
}
return C;
}
}
void Add::Show()
{
for(int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main()
{
Add A(5,0),B(5,3);
for(int i=0;i<A.SIZE();i++)
{
int a;
cin>>a;
A.SetValue(i,a);
}
for(i=0;i<B.SIZE();i++)
{
int b;
cin>>b;
B.SetValue(i,b);
}
Add C;
C=A+B;
C.Show();
}
展开
 我来答
xiarl
推荐于2016-11-24 · TA获得超过1460个赞
知道小有建树答主
回答量:884
采纳率:85%
帮助的人:246万
展开全部

这样?:

#include<iostream>
using namespace std;
class Add
{
int*a;
int size;
public:
Add(const Add&B)
{
if (&B != this)
{
size = B.size;
a = new int[size];//需要赋值吧
for (int index = 0; index < size; ++index)
{
a[index] = B.a[index];
}
}

}
Add operator=(const Add&B)//重载赋值操作符
{
if (&B != this)
{
delete[]a;
size = B.size;
a = new int[size];//需要赋值吧
for (int index = 0; index < size; ++index)
{
a[index] = B.a[index];
}
}
return *this;
}
int SIZE(){ return size; }
Add(int size = 0, int init = 0)
{
this->size = size;
a = new int[size];
if (size == 0)
a = nullptr;
for (int i = 0; i < this->size; i++)
{
a[i] = init;
}

}
//  Add()//你含两个默认参数的构造函数和这个冲突了
//  {
//  a = NULL;
//  size = 0;
//  }
~Add()
{
delete[]a;
}
void SetValue(int i = 0, int value = 0)
{
a[i] = value;
}
Add operator+(const Add&obj);
void Show();
};
Add Add::operator +(const Add&obj)
{
if (obj.a)
{
Add C;
C.size = size + obj.size;
C.a = new int[C.size];
int i = 0;//提到这。。
for (; i < size; i++)
{
C.a[i] = a[i];
}
for (int j = 0; j < obj.size; j++)
{
C.a[i + j] = obj.a[j];
}
return C;//会调用拷贝构造函数
}
}
void Add::Show()
{
for (int i = 0; i < size; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
Add A(5, 0), B(5, 3);
for (int i = 0; i < A.SIZE(); i++)
{
int a;
cin >> a;
A.SetValue(i, a);
}
for (int i = 0; i < B.SIZE(); i++)//c++风格的for循环第一块语句定义的变量只for循环内有效
{
int b;
cin >> b;
B.SetValue(i, b);
}
Add C;
C = A + B;//这里用到赋值操作符
C.Show();
}
heptnaol
2015-04-22 · TA获得超过7259个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1746万
展开全部
恩,返回了一个位于堆栈上的临时对象C,实际上随着operator +函数的返回,对象C已经被销毁,这回导致起码两个问题,1,返回的对象不再有效,2,分配的内存无法释放,被泄漏。

正确做法应该是:
Add &Add:operator +(const Add &a)
最后返回 *this
追问
那为什么函数调用时可以返回某个值,没有问题啊?
这个就不行呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式