Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;对象初始化和构造函数语义_C++_Object_Constructor - Fatal编程技术网

C++ c++;对象初始化和构造函数语义

C++ c++;对象初始化和构造函数语义,c++,object,constructor,C++,Object,Constructor,一个对象的两个初始化之间是否存在差异 Object obj(constructor_arguments); 或 请注意,第二次初始化不是使用new运算符的指针。它是一个非堆变量 在GCC中,编译和工作都很好,我想知道这两个语句是否有任何区别,或者这两个语句在语义上是否相同。是的。第一个是直接初始化的语法,第二个是复制初始化 理论上,第二个调用复制构造函数,但这需要进行优化。查看是否存在实际差异的最佳方法是检查生成的汇编代码。第一个初始化更好,但是如果你让编译器发挥它的魔力,第二个版本可能会优化

一个对象的两个初始化之间是否存在差异

Object obj(constructor_arguments);

请注意,第二次初始化不是使用
new
运算符的指针。它是一个非堆变量


在GCC中,编译和工作都很好,我想知道这两个语句是否有任何区别,或者这两个语句在语义上是否相同。

是的。第一个是直接初始化的语法,第二个是复制初始化


理论上,第二个调用复制构造函数,但这需要进行优化。

查看是否存在实际差异的最佳方法是检查生成的汇编代码。第一个初始化更好,但是如果你让编译器发挥它的魔力,第二个版本可能会优化到同样的效果。可能重复@marclaesen,这意味着查看生成的代码不是最好的方法。事实上,这是最糟糕的方式(在这种情况下),因为它可能导致错误的结论。@LuchianGrigore,我明白你的观点,但我想说这取决于问题(在这方面是模糊的)。如果问题是“理论上哪个更有效”,答案肯定是前者。如果问题是“实践中哪一个更有效?”那么在优化后,它们很可能是等价的。
Object obj = Object(constructor_arguments);