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

Is this a short hand variable declaration?

本文关键字:变量 声明 一个      更新时间:2023-10-16

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

Rectangle r(Point(200,200));

这和一样吗

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

In:

Rectangle r(Point(200,200));

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

In:

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

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

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

根据§12.8/31:,如果编译器决定删除副本,则情况并非如此

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

[…]

  • 当尚未绑定到引用(12.2)的临时类对象将被复制/移动到具有相同cv不合格类型的类对象时,可以通过将临时对象直接构建到被省略的复制/移动的目标中来省略复制/移动操作

[…]

如果采用Point的构造函数没有标记为explicit,那么您也可以使用以下形式:

Rectangle r = Point(200,200);