我正在阅读这本书:“C++:完整参考”,4e。在复制构造函数的主题中,写了以下内容:
<块引用>C++ 定义了两种不同类型的情况,其中一个对象的值被赋予另一个对象,理解这一点很重要。第一个是作业。第二种是初始化,它可以通过以下三种方式中的任何一种发生:
我理解第 1 种和第 2 种情况,但不理解第 3 种情况。
在第三种情况下,如果函数返回一个临时对象,为什么y和临时对象之间不会发生赋值操作?
初始化的必要性是什么?
如果初始化正在发生,它发生在哪里?我的意思是,什么正在被初始化?
答案 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