为什么在以下情况下会发生初始化?

时间:2021-01-22 09:42:08

标签: c++ copy-constructor

我正在阅读这本书:“C++:完整参考”,4e。在复制构造函数的主题中,写了以下内容:

<块引用>

C++ 定义了两种不同类型的情况,其中一个对象的值被赋予另一个对象,理解这一点很重要。第一个是作业。第二种是初始化,它可以通过以下三种方式中的任何一种发生:

  1. 当一个对象显式初始化另一个对象时,例如在声明中。例如。我的类 x = y;
  2. 将对象的副本传递给函数时。例如。功能(y); // 其中 y 是某个类的对象。
  3. 生成临时对象时(最常见的是作为返回值)。例如。 y = 函数(); // y 接收一个临时的返回对象。

我理解第 1 种和第 2 种情况,但不理解第 3 种情况。

在第三种情况下,如果函数返回一个临时对象,为什么y和临时对象之间不会发生赋值操作?

初始化的必要性是什么?

如果初始化正在发生,它发生在哪里?我的意思是,什么正在被初始化?

2 个答案:

答案 0 :(得分:3)

临时对象需要初始化,以便y可以赋值。

答案 1 :(得分:3)

当您初始化时,这意味着您在创建时第一次为变量赋值。如果您赋值,则表示该对象之前已创建,现在(重新)赋值。

std::string name; *A variable is declared but not initialised*
std::string name = 'Sarah'; *The variable is initialised*
name = 'Lisa' *The variable is reassigned a value*

情况3,函数需要创建一个临时对象,该对象只存在于函数作用域内。然后,如果没有另外定义,它会将 this 作为值返回。并且该值可以分配给现有的y,或者如果之前没有值,则初始化y

您需要记住,如果您想从现有对象创建新对象,则需要某种复制机制。这就是为什么我们需要一个复制构造函数:

Person peter = Person{'Peter'} *A new person named peter is created*
Person betterPeter = peter *You initalize newPeter with Peter*

那只会复制peter的地址。因此,如果您在 betterPeter 中进行任何更改,peter 将受到相同更改的影响。您想要的是拥有一个将所有元​​素从 peter 复制到 betterPeter 的函数。这并不难:https://en.cppreference.com/w/cpp/language/copy_constructor