c++ - 为什么是 `r(sqrt(x*x + y*y))` 而不是 `r(x)`
问题描述
我刚刚开始(有点)理解构造函数的概念,在我得到的练习中,我被要求定义一个Complex
包含成员r
和phi
.
我对构造函数的理解:它们只是将成员初始化为预先确定的值,这样如果我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)
因为它仍然会设置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)
andphi(Im)
是可以的,但这只是巧合。
对于第三种情况,使用r(Re)
andphi(Im)
是不正确的。r
并将phi
被初始化为错误的值。
使用r(sqrt(Re*Re+Im*Im))
并phi(atan2(Im,Re))
适用于所有情况。
推荐阅读
- html - URL参数“/?gtnjs=1”是什么意思?
- php - 在重力表格上的段落字段中添加前缀
- java - 两个带有 viewpager 的相同 Activity 实例同时运行
- java - Intellij IDEA Ultimate android 布局预览不工作等待构建完成
- java - 动态向 HashMap 输入数据
- sass - 无法使用 predix px-button-group-design 组件
- java - Twitter4J:投票/投票支持
- c# - 如何将匿名类型转换为列表
在 C# 中使用 Linq to SQL - html - html css img 分辨率操作
- c++ - /usr/bin/ld: 找不到 -l
编译时出错(没有 sudo)