C++ C++;复数模板-/=运算符

C++ C++;复数模板-/=运算符,c++,C++,我有一个用于复数的模板类。我在那里做了一些操作,比如:您正在计算正确的结果,但没有将其存储在变量中。将代码更改为: template<class T> Zespolona<T>& Zespolona<T>::operator /=(const Zespolona<T>& obj) { *this = *this / obj; return *this; } 指向a的指针将是第一个参数,b是第二个参数。返回值不会复

我有一个用于复数的模板类。我在那里做了一些操作,比如:您正在计算正确的结果,但没有将其存储在变量中。将代码更改为:

template<class T>
Zespolona<T>& Zespolona<T>::operator /=(const Zespolona<T>& obj) 
{
    *this = *this / obj;
    return *this;
}
指向
a
的指针将是第一个参数,
b
是第二个参数。返回值不会复制到
a

或者,您可以将呼叫更改为

x = x /= z;
去修理它。也许这有助于你理解这个问题

编辑:
最好将逻辑实现为
运算符/=
,并在
运算符/
的实现中使用它。这样,您就可以在
操作符/=
中就地执行计算并避免复制。

您正在计算正确的结果,但没有将其存储在变量中。将代码更改为:

template<class T>
Zespolona<T>& Zespolona<T>::operator /=(const Zespolona<T>& obj) 
{
    *this = *this / obj;
    return *this;
}
指向
a
的指针将是第一个参数,
b
是第二个参数。返回值不会复制到
a

或者,您可以将呼叫更改为

x = x /= z;
去修理它。也许这有助于你理解这个问题

编辑: 最好将逻辑实现为
运算符/=
,并在
运算符/
的实现中使用它。这样,您就可以在
操作符/=
中就地执行计算并避免复制。

  • 首先将
    this
    的当前值存储到
    temp
    变量中
  • 使用
    temp
    obj
    计算除法,并将其分配给
    this
  • 返回
    *此
>

模板
Zespolona Zespolona::operator/=(const Zespolona&obj)
{
Zespolona temp=*此;
这个->肾素=((temp.reNum*obj.reNum)+(temp.imNum*obj.imNum))/((pow(obj.reNum,2.0))+(pow(obj.imNum,2.0));
这个->imNum=((obj.reNum*temp.imNum)-(temp.reNum*obj.imNum))/((pow(obj.reNum,2.0))+(pow(obj.imNum,2.0));
归还*这个;
}
  • 首先将
    this
    的当前值存储到
    temp
    变量中
  • 使用
    temp
    obj
    计算除法,并将其分配给
    this
  • 返回
    *此
>

模板
Zespolona Zespolona::operator/=(const Zespolona&obj)
{
Zespolona temp=*此;
这个->肾素=((temp.reNum*obj.reNum)+(temp.imNum*obj.imNum))/((pow(obj.reNum,2.0))+(pow(obj.imNum,2.0));
这个->imNum=((obj.reNum*temp.imNum)-(temp.reNum*obj.imNum))/((pow(obj.reNum,2.0))+(pow(obj.imNum,2.0));
归还*这个;
}

/=
应该修改
这个
(但实际上,使用旧值进行计算可能需要临时的)。不相关的可能重复:在实现
conj(.
不相关:您的构造函数可以简化为
Zespolona之后,只计算一次
obj
的幂,例如
p2=obj*conj(obj)
(tre=0.0,tim=0.0):reNum(re),imNum(im){}
,非赋值算术运算符可以简化为非成员,通过值
Zespolona运算符+(Zespolona left,const Zespolona&right){return left+=right;}
此外,您的复制赋值运算符比默认值更糟糕,只需将其删除。
/=
应修改
(但使用旧值计算时可能需要临时)。不相关的可能重复:仅计算一次
obj
的幂,例如
p2=obj*conj(obj)
,在实现
conj(.)
无关:您的构造函数可以简化为
Zespolona(tre=0.0,tim=0.0):reNum(re)、imNum(im){}
,非赋值算术运算符可以简化为非成员,由value
Zespolona运算符占据左侧+(Zespolona left,const Zespolona&right){return left+=right;}
此外,您的复制赋值运算符比默认值更差,只需将其删除即可。另外,您通常会返回一个引用(
Zespolona&
)从赋值运算符的角度来看,最好在
运算符/=
方面执行
运算符/
?您执行的方式不能就地执行
/=
。当操作未就地执行时,有时最好不提供任何复合赋值,因此按照惯例,您会返回一个引用(
Zespolona&
)从赋值运算符的角度来看,最好在
operator/=
方面实现
operator/
?这样做的方式
/=
无法在适当的位置完成。如果操作没有在适当的位置完成,有时甚至最好根本不提供复合赋值
a /= b;
x = x /= z;
template<class T>
Zespolona<T> Zespolona<T>::operator /=(const Zespolona<T>& obj) 
{
    Zespolona<T> temp = *this;
    this->reNum = ((temp.reNum  * obj.reNum) + (temp.imNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
    this->imNum = ((obj.reNum * temp.imNum) - (temp.reNum  * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
    return *this;
}