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

时间:2014-05-11 19:43:54

标签: c++

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

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

然后是另一种方法

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

现在当被问到为什么在A的情况下没有调用复制构造函数并且在B的情况下被调用我的答案和理解如下。如果错误的话,请纠正我

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

在案例B中调用它的原因是因为foo是对象foo而不是对foo的引用。因此调用foo的复制构造函数。 cpy cnstr是foo::foo(const foo& f)。所以声明

fooB(someobject);

等效函数将作为

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

如果我的回答和理解是正确的,请告诉我

2 个答案:

答案 0 :(得分:3)

是的,但IMO你的措辞很奇怪,或者你可能会让事情过于复杂。

第二个签名使用“按值传递”方法。与第一个示例相反,使用“按引用传递”。这个想法是你操作参数的值,而不是参数本身。

这意味着传递参数的临时副本,其生命周期受到函数范围的限制。

答案 1 :(得分:0)

是的,这是正确的。我认为你的意思是在第一种情况下它是对f的引用而不是对foo的引用。与第二种情况相同,您将副本传递给f而不是f本身。