首页 > 解决方案 > 为什么是 `r(sqrt(x*x + y*y))` 而不是 `r(x)`

问题描述

我刚刚开始(有点)理解构造函数的概念,在我得到的练习中,我被要求定义一个Complex包含成员rphi.

我对构造函数的理解:它们只是将成员初始化为预先确定的值,这样如果我Complex在 main 函数中包含一个类型的对象而不给 memberphi赋值,构造函数就会简单地为其赋值在构造函数中设置。按照我自己对构造函数的定义,我对以下事实感到困惑:在解决方案中,它指出:

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 函数中提到的对象的“缺失”成员设置为预定值,因此肯定是多余的,r(sqrt(Re*Re+Im*Im))并且phi(atan2(Im,Re))所需要的只是r(Re)并且phi(Im)因为它仍然会设置rphi等于0

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

标签: c++constructorcomplex-numbers

解决方案


肯定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)andphi(Im)是可以的,但这只是巧合。
对于第三种情况,使用r(Re)andphi(Im)是不正确的。r并将phi被初始化为错误的值。

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


推荐阅读