在 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/

10-11 14:44