为什么在这种情况下没有调用复制构造函数-我的推理正确吗?

Why is the copy constructor not called in this case - Is my reasoning correct?

本文关键字:推理 我的 构造函数 这种情况下 复制 调用 为什么      更新时间:2023-10-16

假设我有一个名为Myobj的对象,该对象具有所有默认值(复制cstr,移动cstr,赋值和复制赋值)。现在假设有这样一个方法

void fooA(foo& f){..}  --->A

然后是另一个方法

void fooB(foo f){..}   --->B

现在,当被问到为什么在A的情况下不调用复制构造函数而在B的情况下调用复制构造函数时,我的回答和理解如下。如有错误,请指正

在情况A中没有调用它的原因是foo&是对foo的引用,而不是foo因此不会调用foo的复制构造函数。case A中的f只是传递对象的别名。

在情况B中调用它的原因是因为foo是对象foo而不是对foo的引用。因此调用foo的复制构造函数。拷贝目录为foo::foo(const foo& f)。因此在语句

fooB(someobject);

在函数上相当于

void fooB(foo f){..} gives  fooB f (someobject); //Cpy constr is called

请让我知道我的答案和理解是否正确

是的,但在我看来你的措辞很奇怪,或者你可能把事情弄得太复杂了。

第二个签名使用"按值传递"方法。与第一个示例相反,在第一个示例中使用了"通过引用传递"。其思想是操作实参的值,而不是实参本身。

这意味着对传递的形参进行临时复制,其生存期受函数作用域的限制。

是的。我认为你的意思是在第一种情况下,它是对f的参考,而不是对foo的参考。同样,在第二种情况下,你是传递一个副本给f,而不是f本身。