C++ C(3)之间的区别是什么;和C{3};当实例化一个类时? #包括 使用名称空间std; C类{ 公众:int a,; public:C(inti){a=i;} }; int main() { C(3);//C{3}; cout
有两个区别:C++ C(3)之间的区别是什么;和C{3};当实例化一个类时? #包括 使用名称空间std; C类{ 公众:int a,; public:C(inti){a=i;} }; int main() { C(3);//C{3}; cout,c++,initialization,C++,Initialization,有两个区别: 大括号初始化语法(假设列表为非空)可以调用std::initializer\u list构造函数,如果可能,将始终这样做。括号语法不会调用std::initializer\u list构造函数 大括号初始化语法禁止缩小转换范围 在您的示例中没有区别,但是: 如果C有一个采用std::initializer\u list的构造函数,那么C{3}将调用该构造函数,而C(3)将调用采用int的构造函数 C{3.14}将不会编译,因为转换正在缩小,但是C(3.14)将编译 这种情况的效果是
std::initializer\u list
构造函数,如果可能,将始终这样做。括号语法不会调用std::initializer\u list
构造函数C
有一个采用std::initializer\u list
的构造函数,那么C{3}
将调用该构造函数,而C(3)
将调用采用int
的构造函数C{3.14}
将不会编译,因为转换正在缩小,但是C(3.14)
将编译这种情况的效果是相同的
cc(3);
is
检查T
的构造函数,通过重载解析选择最佳匹配。然后调用构造函数初始化对象
C{3};
is(自C++11以来)
如果前一个阶段没有生成匹配,则T
的所有构造函数都会参与针对由带括号的init列表元素组成的参数集的重载解析,限制条件是只允许非收缩转换
因此,对于这两种情况,C::C(int)
用于初始化对象
根据
C
的行为,C(3);
和C{3};
之间的其他潜在差异包括:
- 如果
是,则在列表初始化中首选C
- Ohterwise,如果
有一个构造函数,那么在列表初始化中首选它C
- 否则,当在中考虑构造函数时,在列表初始化中允许非窄化转换
C(3)
和C{3}
的哪种风格在使用OO的其他语言中更受欢迎?Java和C#两者都没有是正确的吗?C#和Java的构造函数几乎与C(int I)相同
,只是需要注意的是,他们会检查传入的类型。新的C(3.14)
将无法编译。但是,不支持{}
语法。在C#中,新的C{a=3}
是一个对象初始值设定项,您必须在{}中指定成员变量
。您的第一个语句1通常是不正确的:聚合初始化是最高优先级的;然后是空列表的值初始化。然后出现这样的情况,C
本身就是一个std::initializer\u list
。只有在这一点上,才会考虑构造函数,重载解析才有机会匹配构造函数接受std::initializer\u list
的C的r。无论如何,从C++14开始,列表初始化规范中的事情顺序似乎随着每一个新标准而变化draft@M.M空列表的好处是,我将更新我的答案以反映这一点。我不认为聚合初始化与我编写的内容冲突,因为类不能既是一个聚合,又有一个std::initializer\u list
构造函数。回答得好。这也可以避免这种情况,谢谢。我可以问一下C(3)
和C{3}
的哪种风格在其他有OO的语言中更流行吗?Java和C#两者都没有是正确的吗?@Ben我不确定,我猜是C(3)列表初始化是从C++ 11中引入的,C++中被认为是现代风格。
#include <iostream>
using namespace std;
class C{
public: int a;
public: C (int i){a = i ; }
};
int main()
{
C c(3); // C c{3};
cout<<c.a;
return 0;
}