【问题标题】:Initializing objects in c++在 C++ 中初始化对象
【发布时间】:2018-10-22 20:32:18
【问题描述】:

在 C++ 中有多种初始化对象的方法。下面有两个例子,ent1 和 ent2。我想知道有什么区别,其中一个更“正确”还是比另一个更受欢迎?

class Entity {
public:
    int h;
    Entity(int health) : h(health) { }
}

Entity ent1(10);

Entity ent2 = Entity(10);

【问题讨论】:

  • 在这种情况下,它们是相同的,首选第一个。
  • 为什么首选第一个?
  • 因为没有无意义的重复。
  • 有意义。你说'在这种情况下它们是相同的'。在什么情况下它们会不一样?因为如果它们是相同的,那么有两种制作对象的方法很奇怪
  • 一个不同之处在于,第二种形式需要 C++17 之前的复制构造函数。见stackoverflow.com/questions/1051379/…

标签: c++ object initialization


【解决方案1】:

在 C++17 中,这两者是相同的。但是,在 C++17 之前,存在如下细微差别:

下面是一个拷贝构造函数。这将创建一个匿名实体,然后复制到ent2,尽管根据copy epsilon 可以省略复制。

Entity ent2 = Entity(10);

下面是直接实例化,分配ent1的内存,并将值10放在构造函数指定的区域。

Entity ent1(10); 

在 C++17 之前,首选直接的原因是它不需要额外的复制步骤。这个优势在 C++17 中是不存在的。

【讨论】:

  • 我很确定标准说第一个是 not 复制的。它看起来和它一样,但实际上它的处理方式与第二个完全相同。
  • 该副本很可能在 C++17 之前被省略,而在 C++17 中它保证被省略。
  • 不是“epsilon”
  • @juanchopanza 在 C++17 中甚至没有要省略的副本,这两种语法都指定了一个由参数 10 构造的变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2018-02-10
  • 2016-05-30
相关资源
最近更新 更多