【问题标题】:Why does initialization happen in the following case?为什么在以下情况下会发生初始化?
【发布时间】:2021-01-22 09:42:08
【问题描述】:

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

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

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

我了解第一种和第二种情况,但不了解第三种情况。

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

初始化的必要性是什么?

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

【问题讨论】:

  • 要稍微复杂一点,请阅读copy elision
  • 你不能在 C++ 中使用一个对象,直到它没有被初始化。赋值使用现有对象,这意味着您需要先初始化它。顺便说一句,对类对象 x 的赋值有时可能会更好地可视化为 x.operator=(arg) 而不是 x=arg。这清楚地表明您只是在使用一个对象,就像在其上调用任何其他(非特殊)成员函数一样。

标签: c++ copy-constructor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当你初始化时,这意味着你在创建时第一次给你的变量一个值。如果您分配,则意味着该对象之前已被创建,现在被(重新)分配了一个值。

    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 中,函数需要创建一个临时对象,该对象只存在于函数的作用域内。然后,如果未另行定义,它会将其作为值返回。并且该值可以分配给现有的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

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多