构造函数的目的不是设置“缺少”成员。构造函数的目的是将对象初始化为逻辑上一致的初始状态。
在您的情况下,您的类被设计为存储极坐标,但您将笛卡尔坐标传递给构造函数。这意味着要将对象初始化为逻辑上正确的状态,它必须在两者之间进行转换。
一定 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 = imaginary 。另一种是将它们表示为具有半径和角度(极坐标)的圆上的点。你有的构造函数是计算半径( r )使用毕达哥拉斯定理a ^ 2 + b ^ 2 = c ^ 2 ...或 r = sqrt(Re*Re + Im*Im) 同样地,它是计算机 phi 作为那一点的角度。
x = real
y = imaginary
r = sqrt(Re*Re + Im*Im)
根据您对点的数学计算,一个表示可能比另一个更好。