当 在 C++ 中声明 对象时 -
之间有什么区别
MyClass myObj (a,b,c);
(我理解这是调用带有三个参数的构造函数)
对比
MyClass myObbj{a,b,c};
不确定这里的大括号是什么意思?
作为引用,我使用以下代码
// Inertial Navigation EKF
NavEKF EKF{&ahrs, barometer, sonar};
AP_AHRS_NavEKF ahrs{ins, barometer, gps, sonar, EKF};
1.
花括号的使用是否如
NavEKF EKF{&ahrs, 气压计, 声纳}; C++ 标准的一部分。 gcc 4.6.1 提示 - 函数定义没有声明参数。
2.
给定的
AP_AHRS_NavEKF ahrs;
AP_Baro 气压计;
测距仪声纳;
2A。为什么编译器会提示这个
NavEKF EKF(&ahrs, 气压计, 声纳);
但允许这个
NavEKF EKF(AP_AHRS_NavEKF &ahrs, AP_Baro 气压计, RangeFinder 声纳);
最佳答案
基本意图是它们通常意味着相同的事情。最大的区别是花括号消除了“最令人烦恼的解析”,在那里你试图定义一个对象,但最终实际上是声明了一个函数。
因此, NavEKF EKF{&ahrs, barometer, sonar};
通常等同于 NavEKF EKF(&ahrs, barometer, sonar);
。但是,如果你有类似的东西: NavEKF EKF();
与 NavEKF EKF{};
它们是不同的——NavEKF EKF();
声明了一个名为 EKF 的函数,它不接受参数并返回一个 NavEKF
,而 NavEKF EKF{};
做你(可能)通常期望的,并创建一个默认值- EKF
类型的初始化对象 NavEKF
。
但是,在某些情况下,如何解释事物存在歧义,并且根据您使用括号还是大括号,歧义的解决方式有所不同。特别是,如果您使用花括号,并且有任何方法可以将内容解释为 initializer_list,这就是它的解释方式。当且仅当失败时,它不能被视为一个 initializer_list,它会寻找一个将大括号中的元素作为参数的重载(此时,您将获得正常的重载解析,因此它基于最适合,而不仅仅是“它可能被解释为完全适合吗?”)
关于c++ 用花括号声明对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34007862/