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

C++ 为什么是'r(sqrt(x*x+;y*y))`而不是'r(x)`,c++,constructor,complex-numbers,C++,Constructor,Complex Numbers,我刚刚开始(某种程度上)理解构造函数的概念,在我所做的一个练习中,我被要求定义一个包含成员r和phi的类Complex 我对构造函数的理解:它们只是将成员初始化为预定值,这样,如果我在主函数中包含Complex类型的对象,而不给memberphi赋值,那么构造函数只会给它赋值,我会在构造函数中设置一个值。根据我自己对构造函数的定义,我对以下事实感到困惑:在解决方案中,它指出: class Complex { private: double r,phi; public: Complex(doub

我刚刚开始(某种程度上)理解构造函数的概念,在我所做的一个练习中,我被要求定义一个包含成员
r
phi
的类
Complex

我对构造函数的理解:它们只是将成员初始化为预定值,这样,如果我在主函数中包含
Complex
类型的对象,而不给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)) {}
我不明白为什么构造函数设置为:

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


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

我假设我错了,构造函数实际上不仅仅是将主函数中提到的对象的“缺失”成员设置为预定值。非常感谢您的帮助

当然
r(sqrt(Re*Re+Im*Im))
phi(atan2(Im,Re))
都是多余的,所需要的只是
r(Re)
phi(Im)
,因为它仍然会将
r
phi
设置为
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)
是不正确的
r
phi
将被初始化为错误的值


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

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


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

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


根据您对点所做的数学运算,一种表示可能比另一种更好。

由于构造函数的目的只是设置“缺少”成员-不,不是这样,构造函数需要初始化所有数据成员,不管是否缺少。
sqrt(a*a)
并不总是与
a
相同。例如,如果
a
为-1会怎么样?
sqrt(a*a+b*b)
不可能等同于
sqrt(a)
,因为首先,它不再是
b
的函数。。。你似乎假设<代码> B==0 < /COD>和<代码> A>=0 < /Cord>这是一个巨大的假设。我认为它与C++无关,只是你的<代码>复合体< /Cord>类被设计成以极坐标格式(半径、角度)存储坐标,但仍然能够从笛卡尔格式(实、虚)的值中构造。初始值设定项列表中的表达式执行转换。另请参见:构造函数的目的是在已知状态下构造对象。在这种情况下,
Complex
类型的对象具有半径和角度,这是复数的常见表示形式之一。该构造函数根据传递给构造函数的
x
y
值初始化半径(
r
)和角度(
phi
)。显然,
x
y
是直角坐标,这是表示复数的另一种常见方式。所以构造器将直角坐标转换成极坐标。我被它表示
(double Re=0,double Im=0)
的事实所困扰,然后任何类似
sqrt(Re*Re+Im*Im)
的计算都是相等的
0
double Re=0,double Im=0
是否像占位符一样,只有在主函数中没有提到该特定成员时才分配占位符?@user9078057是的,如果没有为该参数提供值,则将使用这些默认值。@user9078057,您对
的理解(double Re=0,double Im=0)
表示不正确。只有在未指定值的情况下,这些才是默认值。如果指定了值,则调用中将使用它们,而不是默认值。