c++用大括号声明对象
c++ declaring objects with curly braces
当在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_AVEKF AHRS;
AP-Baro气压计;
测距声纳;
2A。为什么编译器会抱怨这个
NavEKF EKF(&ahrs,气压计,声纳);
但允许此
NavEKF EKF(AP_AHRS_NavEKF&AHRS,AP_Baro气压计,测距声纳);
基本意图是它们通常意味着相同的东西。最大的区别在于,花括号消除了"最麻烦的解析",在这种解析中,您试图定义一个对象,但最终却实际声明了一个函数。
因此,NavEKF EKF{&ahrs, barometer, sonar};
是,通常将等价于NavEKF EKF(&ahrs, barometer, sonar);
。然而,如果您有类似的东西:NavEKF EKF();
和NavEKF EKF{};
,它们是不同的——NavEKF EKF();
声明了一个名为EKF的函数,该函数不接受参数并返回NavEKF
,而NavEKF EKF{};
执行您(可能)通常期望的操作,并创建一个类型为NavEKF
的名为EKF
的默认初始化对象。
然而,在某些情况下,如何解释事物存在歧义,并且歧义的解决方式因使用括号还是大括号而异。特别是,如果您使用大括号,并且有任何方法可以将内容解释为initializer_list,那么它就是这样解释的。如果并且只有当它失败了,所以它不能被视为initializer_list时,它才会寻找一个以大括号中的元素为参数的重载(在这一点上,你会得到正常的重载解析,所以它是基于最佳拟合,而不仅仅是"它可能被解释为完全拟合吗?")
大括号就是所谓的"统一初始化"。这个术语不是C++标准的一部分,但它被广泛理解并且易于研究。特别是,在提供的上下文中,它的意思是"用给定的参数调用MyObj的构造函数"。
使用括号调用构造函数,然后根据需要选择如何初始化数据成员。
使用大括号直接初始化数据成员,除非定义了一个以std::initializer_list
为输入的构造函数,在这种情况下,大括号形成了传递给该构造函数的值列表。
- Arduino C++在构造函数中用参数声明对象数组
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 如何使用unique_ptr和make_unique正确声明对象数组
- 声明对象时,如何在C 中修复C2065错误
- 声明对象而不调用默认构造函数
- 一旦对象设置为 null,用于声明对象的堆大小的变量就设置为 null?
- 我可以使用名称而不是类型来声明对象文字吗?
- 在制作(Qt等)GUI时声明对象
- 在基本的GUI编程中,在哪里声明对象和方法
- 同时使用模板和参数声明对象
- "Undefined reference to"使用双模板类声明对象时出错
- 在头文件 C++ 中声明对象
- 在其类中声明对象
- C 可以通过使用要求其为某个类别的对象来声明对象
- 声明对象
- (C++)如何基于条件声明对象类成员
- 使用变量声明对象的名称
- C++ OOP 体系结构:决定是从基类声明对象还是继承基类
- 在声明对象之前在全局函数中使用类的成员函数