如何初始化函数中的局部变量?

时间:2011-11-22 20:06:34

标签: c++

如何初始化函数中的局部变量?出于性能原因,我应该这样做吗?

Point2D point(1,2);

还是喜欢这个?

Point2D point = Point2D(1,2);

甚至重要吗?

5 个答案:

答案 0 :(得分:7)

不,没关系。两者都会导致对同一个构造函数的调用。

答案 1 :(得分:4)

你应该以第一种方式做到这一点,因为如果你这样做,第二种方式我相信编译器会做一些比必要更复杂的事情。我认为它创建了一个临时对象来表示右侧,然后使用复制构造函数将值复制到左侧的对象。

我可能错了,所以检查你的装配清单。

答案 2 :(得分:2)

第一个只调用构造函数,而第二个调用构造函数,然后将其复制到point。因此,您应该使用第一个,因为它不会启动复制操作。

答案 3 :(得分:2)

是的,这很重要。第一个版本Point2D point(1,2)将调用构造函数,而第二个版本Point2D point = Point2D(1,2)将首先创建一个新的Point2D(右边的那个)然后将调用复制构造函数来实际创建point。如您所见,这是C ++与Java或C#之间的巨大差异。

答案 4 :(得分:2)

大多数情况下,返回值优化会使这两个选项从性能角度看足够相似(特别是如果您定义了一个移动赋值运算符)

还有其他事情需要考虑。

如果你的类型有一个空的构造函数,那么这样做是有问题的:

Point2D p(); // instead of Point p;

这被称为Most Vexing Parse。使用第二种形式可以避免这种情况:

Point2D p = Point2D();

或者使用最新标准中引入的统一初始化语法

Point2D p{};