如何初始化函数中的局部变量?出于性能原因,我应该这样做吗?
Point2D point(1,2);
还是喜欢这个?
Point2D point = Point2D(1,2);
甚至重要吗?
答案 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{};