为什么是 r(sqrt(x*x + y*y)) 而不是 r(x)
Why `r(sqrt(x*x + y*y))` rather than `r(x)`
我刚刚开始(有点)理解构造函数的概念,在给我的练习中,我被要求定义一个 class Complex
成员 r
和phi
.
我对构造函数的理解:它们只是将成员初始化为预定值,这样如果我要在主函数中包含一个类型为 Complex
的对象,而没有为成员 [=13] 赋值=],构造函数会简单地为它分配一个我在构造函数中设置的值。按照我自己对构造函数的定义,我感到困惑的是,在解决方案中,它指出:
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)) {}
既然构造函数的目的只是将main函数中提到的对象的"missing"成员设置为预定值,那么r(sqrt(Re*Re+Im*Im))
和phi(atan2(Im,Re))
肯定是多余的,仅此而已需要的是 r(Re)
和 phi(Im)
,因为它仍然会设置 r
和 phi
等于 0
。
我假设我错了,构造函数实际上所做的不仅仅是将 main 函数中提到的对象的 "missing" 成员设置为预定值。任何帮助是极大的赞赏。
surely r(sqrt(Re*Re+Im*Im))
and phi(atan2(Im,Re))
are excessive, and all that is needed is r(Re)
and phi(Im)
because it would still set r
and phi
equal to 0
.
这是一个错误的结论。
根据构造函数的声明,您可以使用以下方法构造 class 的对象:
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)
是不正确的。 r
和 phi
将被初始化为错误的值。
使用 r(sqrt(Re*Re+Im*Im))
和 phi(atan2(Im,Re))
适用于所有情况。
构造函数的目的不是设置 "missing" 成员。构造函数的目的是将对象初始化为逻辑上一致的初始状态。
在您的情况下,您的 class 旨在存储极坐标,但您将笛卡尔坐标传递给构造函数。这意味着要将对象初始化为逻辑上正确的状态,它必须在两者之间进行转换。
我认为这里的挑战在于有两种表示虚数的方法。一种是实部和虚部,本质上用x = real
、y = imaginary
将它们表示在一个平面上。另一种是将它们表示为具有半径和角度(极坐标)的圆上的点。您拥有的构造函数正在使用勾股定理 a^2 + b^2 = c^2 ... 或 r = sqrt(Re*Re + Im*Im)
计算半径 (r
),类似地,它正在计算 phi
作为到那个点的角度。
根据您对点所做的数学运算,一种表示法可能比另一种表示法更好。
我刚刚开始(有点)理解构造函数的概念,在给我的练习中,我被要求定义一个 class Complex
成员 r
和phi
.
我对构造函数的理解:它们只是将成员初始化为预定值,这样如果我要在主函数中包含一个类型为 Complex
的对象,而没有为成员 [=13] 赋值=],构造函数会简单地为它分配一个我在构造函数中设置的值。按照我自己对构造函数的定义,我感到困惑的是,在解决方案中,它指出:
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)) {}
既然构造函数的目的只是将main函数中提到的对象的"missing"成员设置为预定值,那么r(sqrt(Re*Re+Im*Im))
和phi(atan2(Im,Re))
肯定是多余的,仅此而已需要的是 r(Re)
和 phi(Im)
,因为它仍然会设置 r
和 phi
等于 0
。
我假设我错了,构造函数实际上所做的不仅仅是将 main 函数中提到的对象的 "missing" 成员设置为预定值。任何帮助是极大的赞赏。
surely
r(sqrt(Re*Re+Im*Im))
andphi(atan2(Im,Re))
are excessive, and all that is needed isr(Re)
andphi(Im)
because it would still setr
andphi
equal to0
.
这是一个错误的结论。
根据构造函数的声明,您可以使用以下方法构造 class 的对象:
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)
是不正确的。 r
和 phi
将被初始化为错误的值。
使用 r(sqrt(Re*Re+Im*Im))
和 phi(atan2(Im,Re))
适用于所有情况。
构造函数的目的不是设置 "missing" 成员。构造函数的目的是将对象初始化为逻辑上一致的初始状态。
在您的情况下,您的 class 旨在存储极坐标,但您将笛卡尔坐标传递给构造函数。这意味着要将对象初始化为逻辑上正确的状态,它必须在两者之间进行转换。
我认为这里的挑战在于有两种表示虚数的方法。一种是实部和虚部,本质上用x = real
、y = imaginary
将它们表示在一个平面上。另一种是将它们表示为具有半径和角度(极坐标)的圆上的点。您拥有的构造函数正在使用勾股定理 a^2 + b^2 = c^2 ... 或 r = sqrt(Re*Re + Im*Im)
计算半径 (r
),类似地,它正在计算 phi
作为到那个点的角度。
根据您对点所做的数学运算,一种表示法可能比另一种表示法更好。