我刚刚开始(有些)理解构造函数的概念,在给出的练习中,我被要求定义一个由成员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
。
我认为我错了,而构造函数实际上所做的不仅仅是将主函数中提到的对象的“缺失”成员设置为预定值。任何帮助是极大的赞赏。
答案 0 :(得分:5)
肯定
jquery
和popper.js
过多,并且仅需要r(sqrt(Re*Re+Im*Im))
和phi(atan2(Im,Re))
,因为它仍然会设置r(Re)
和{{1} }等于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
。
答案 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)
为到该点的角度。
根据您对这些点所做的数学运算,一种表示可能比另一种更好。