在我正在阅读的一本书中看到这一点:
Rectangle r(Point(200,200));
这是否与:
相同Rectangle r = Rectangle(Point(200,200));
答案 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类构造的副本,该类的构造方式与第一个类相同。
第二个引发额外的移动/复制操作。