读书人

关于重载操作符构成的表达式的有关问题

发布时间: 2012-03-01 10:25:47 作者: rapoo

关于重载操作符构成的表达式的问题
小弟最近编了一个类用来管理多项式的运算,重载了赋值操作符 "= "和乘法操作符 "* ",但是在计算c=a*b时,c无法得到a*b的结果。加急请高手指点啊!代码附在下边了:

class CPoly
{
public:
CPoly operator*(const CPoly &b);
CPoly operator*(const CComplex &b);
CPoly operator+(const CPoly &b);
CPoly &operator=(const CPoly &a);

void Initialize(CComplex b[], UINT n);

CPoly();
virtual ~CPoly();
UINT order; //存储多项式的阶数,大小为数组a的长度减1
CComplex *a; //存储多项式系数的数组,按升幂排列,类型为自定义复数类
};


CPoly &CPoly::operator =(const CPoly &b)
{
if(this == &b)
return *this;
if(a!=NULL)
delete [] a;
a = new CComplex[b.order+1];
order=b.order;
for(int i=0; i <order+1; i++)
{
a[i]=b.a[i];
}

return *this;
}


CPoly CPoly::operator *(const CPoly &b)
{
CPoly c;
c.order=order+b.order;
c.a = new CComplex[c.order+1];
int i,j;
for(i=0; i <c.order+1; i++)
{
c.a[i].Initialize(0.0,0.0);
}
for(i=0; i <=b.order; i++)
{
for(j=order; j> =0; j--)
{
c.a[j+i]=c.a[j+i]+a[j]*b.a[i];
}
}
return c;
}

测试代码如下:
CPoly a,b,c;
a.Initialize(data1,1);
b.Initialize(data2,1);//以上部分能够正常运行
c=a*b;//乘法函数内部结果正确,但是c无法接受其结果

[解决办法]
需要写一个复制构造函数

return c; 返回以一个局部对象,调用默认的复制构造函数给临时对象

c=a*b执行 完临时对象就被析构拉

但是对象c的数据成员CComplex *a;指向的临时对象CComplex *a; 

自己没有分配内存,所以临时对象析构了,他就什么也不是拉
[解决办法]
加这个复制构造函数试试 其实跟 重载=运算符很象
CPloy::CPloy(const CPloy &b)
{
a = new CComplex[b.order+1];
order=b.order;
for(int i=0; i <order+1; i++)
{
a[i]=b.a[i];
}


}
[解决办法]
c=a+b

复制构造函数和operator=两个都会调用

你在两个函数中都用cout输出信息就知道拉

读书人网 >C++

热点推荐