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

时间:2019-03-12 18:48:29

标签: c++ constructor complex-numbers

我刚刚开始(有些)理解构造函数的概念,在给出的练习中,我被要求定义一个由成员Complex和{{1}组成的类r }。

我对构造函数的理解:它们只是将成员初始化为预定值,这样,如果我要在主函数中包括类型phi的对象,而无需为成员Complex分配值,构造函数将简单地为其分配一个我将在构造函数中设置的值。按照我自己对构造函数的定义,我对以下事实感到困惑:在解决方案中,它指出:

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))过多,而{{ 1}}和phi(atan2(Im,Re)),因为它仍会将r(Re)phi(Im)设置为等于r

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

3 个答案:

答案 0 :(得分:5)

  

肯定jquerypopper.js过多,并且仅需要r(sqrt(Re*Re+Im*Im))phi(atan2(Im,Re)),因为它仍然会设置r(Re)和{{1} }等于phi(Im)

那是一个错误的结论。

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

r

对于前两种情况,使用phi0是可以的,但这只是出于巧合。
对于第三种情况,使用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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

我认为这里的挑战是存在两种表示虚数的方法。一个是实部和虚部,基本上用[DisplayName("Gain/Loss")] public int gainLoss { get; set; } public IEnumerable<SelectListItem> gainLosses { get { return CustomEnum.Enum.GetItems<GainLosses>().Select(x => new SelectListItem() { Text = x.ToString(), Value = ((int)x).ToString() }); } } // x = real表示它们在一个平面上。另一种是将它们表示为具有半径和角度(极坐标)的圆上的点。您拥有的构造函数使用勾股定理a ^ 2 + b ^ 2 = c ^ 2 ...或y = imaginary计算半径(r),类似地,计算r = sqrt(Re*Re + Im*Im)为到该点的角度。

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