Object obj = Object()和Object obj()有什么区别?
我认为它有很多关于它的信息,但是我不知道这是如何被调用的。 我不明白下两个代码的区别:
Object obj(); 和
 Object obj = Object(); 
你能解释一下吗? 或者至less说出如何称呼它。
 Object obj(); 
 不是对象的实例,它是一个函数obj的声明 ,它不接受任何参数,并返回一个Object的实例。 
 Object obj; 
 是一个default initialization ,即用隐式构造函数实例化(因此,默认的隐式构造函数或用户定义的非explicit构造函数不带参数),这个声明调用非POD Object成员的隐式构造函数,而对于PODtypes,初始化它们(它们不会被清零)。 这对于Object的成员等是recursion的。 
 Object obj{}; 
 是一个列表初始化或聚合初始化 (如果Object是一个聚合)。 对于空括号来说,行为是相同的:PODtypes的所有成员都是零初始化的,非POD是默认初始化的。 
 Object obj = Object(); 
 理论上讲是两步说明:1)创build临时Object实例;  2)然后通过复制构造函数/移动构造函数/复制运算符/移动运算符构造obj。 但在实践中,它是默认构build的,考虑到copy / move-elision(即使在所有优化closures的情况下,在所有现代编译器上都可以启用),您必须明确禁用elision。 最好不要使用这个变种。 
预结论
select
 Object obj; 
要么
 Object obj{}; 
 如果您想要快速初始化而不将其POD成员归零,请select第一个。 如果你想要确保所有的POD成员在Object实例化后都是零,就select第二个。 
实际上,在从其成员读取之前,这两个变体在所有现代操作系统的运行时间上都具有相同的速度。
所以…
结论
使用值初始化:
 Object obj{}; 
除非你需要在异国情调的系统上的实时性能。
 Object obj(); 
声明一个函数,而不是一个对象! 这是“最烦人的parsing”的一个例子。
 Object obj = Object(); 
 要求Object有一个可访问的移动构造函数或复制构造函数(尽pipe编译器可能最终将移动/复制)。 
简单的方法来创build一个对象包括:
 Object obj; Object obj{}; 
 Object obj(); 
 声明一个函数名obj ,返回一个Object并且不带任何参数。 这通常不是你想要的。 
 Object obj = Object(); 
 声明一个名为obj然后使用临时默认构造的Object复制初始化。 您通常不希望这样做,除非您将对象重置为默认状态。 
一般来说,如果你想构造而不调用构造函数,你可以使用
 Object obj; //or Object obj{}; 
巨大差距。
第一个函数原型是函数不带任何参数并返回一个Object。
第二个通过调用默认构造函数来实例化对象。 为了避免疑问,不指定赋值运算符。
在第一种情况下放下括号以使语句等同。