这是一个简短的变量声明吗?

时间:2015-06-25 16:38:50

标签: c++

在我正在阅读的一本书中看到这一点:

Rectangle r(Point(200,200));

这是否与:

相同
Rectangle r = Rectangle(Point(200,200));

2 个答案:

答案 0 :(得分:2)

在:

Rectangle r(Point(200,200));

您正在通过带有Rectangle对象的构造函数初始化Point对象。

在:

Rectangle r = Rectangle(Point(200,200));

您正在构建一个Rectangle临时对象,然后将其传递给Rectangle的复制/移动构造函数。

如果正确编写了复制构造函数,那么生成的对象是相同的,但理论上会在后者中调用一个复制/移动构造函数。

如果编译器决定删除副本,则不是这样,根据§12.8/ 31:

  

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。在这种情况下,实现将省略的复制/移动操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的破坏发生在两个对象的后期时间。在没有优化的情况下销毁.122在下列情况下允许复制/移动操作的省略,称为复制省略(可以合并以消除多个副本):

     

[...]

     
      
  • 当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动的目标
  •   
     

[...]

如果带有Point的构造函数未标记为explicit,那么您还可以使用以下格式:

Rectangle r = Point(200,200);

答案 1 :(得分:0)

第一个调用Rectangle的构造函数,该构造函数传递一个临时Point对象。

第二个是从临时Rectangle类构造的副本,该类的构造方式与第一个类相同。

第二个引发额外的移动/复制操作。