为什么`r(sqrt(x * x + y * y))`而不是`r(x)`

问题描述 投票:0回答:3

我刚开始(有点)理解构造函数的概念,在我给出的练习中,我被要求用成员Complexand和r定义一个类phi

我对构造函数的理解:它们只是将成员初始化为一个预定的值,这样如果我在主函数中包含Complexin类型的对象而没有赋值给成员phi,那么构造函数只会给它赋一个值,我会已在构造函数中设置。根据我自己对构造函数的定义,我对以下事实感到困惑:在解决方案中,它指出:

class Complex {
private:
double r,phi;
public:
 Complex(double Re=0, double Im=0):
 r(sqrt(Re*Re+Im*Im)), phi(atan2(Im,Re)) {}

我很困惑为什么构造函数设置为:

Complex(double Re=0, double Im=0): r(sqrt(Re*Re+Im*Im)), phi(atan2(Im,Re)) {}

由于构造函数的目的只是将主函数中提到的对象的“缺失”成员设置为预定值,当然r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re))are过多,所需要的只是r(Re)and和phi(Im)be因为它仍然会设置rand phiequal到0

我假设我错了,构造函数实际上做的不仅仅是将main函数中提到的对象的“缺失”成员设置为预定值。任何帮助是极大的赞赏。

c++ constructor complex-numbers
3个回答
5
投票

肯定r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re))是过度的,所需要的只是r(Re)phi(Im)因为它仍然会设置rphi等于0

这是一个错误的结论。

给定构造函数的声明,您可以使用以下方法构造类的对象:

Complex c1;             // Equivalent to Complex c1(0, 0);
Complex c2(1.0);        // Equivalent to Complex c2(1.0, 0);
Complex c3(1.0, 1.0);   

对于前两种情况,使用r(Re)phi(Im)是可以的,但仅仅是因为巧合。 对于第三种情况,使用r(Re)phi(Im)是不正确的。 rphi将被初始化为错误的值。

使用r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re))适用于所有情况。


4
投票

构造函数的目的不是设置“缺少”成员。构造函数的目的是将对象初始化为逻辑上一致的初始状态。

在您的情况下,您的类被设计为存储极坐标,但您将笛卡尔坐标传递给构造函数。这意味着要将对象初始化为逻辑上正确的状态,它必须在两者之间进行转换。


0
投票

我认为这里面临的挑战是有两种表示虚数的方法。一个是真实部分和虚部,基本上用x = realy = imaginary在一个平面上代表它们。另一种是将它们表示为具有半径和角度(极坐标)的圆上的点。你有的构造函数是使用毕达哥拉斯定理计算半径(r)a ^ 2 + b ^ 2 = c ^ 2 ...或r = sqrt(Re*Re + Im*Im),类似地,它计算phi作为该点的角度。

根据您对点的数学计算,一个表示可能比另一个更好。

© www.soinside.com 2019 - 2024. All rights reserved.