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

use*_*057 0 c++ constructor complex-numbers

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

我对构造函数的理解:它们只是将成员初始化为预定的值,这样,如果我要Complex在main函数中包含类型的对象,而没有给member赋值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)) {}
Run Code Online (Sandbox Code Playgroud)

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

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

由于构造函数的目的仅仅是将main函数中提到的对象的“缺失”成员设置为预定值,因此肯定r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re))过多,并且所需要做的就是r(Re)并且phi(Im)因为它将仍然设置rphi等于0

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

R S*_*ahu 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);   
Run Code Online (Sandbox Code Playgroud)

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

在所有情况下均可使用r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re))工作。