假设我有一个名为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
如果我的回答和理解是正确的,请告诉我
答案 0 :(得分:3)
是的,但IMO你的措辞很奇怪,或者你可能会让事情过于复杂。
第二个签名使用“按值传递”方法。与第一个示例相反,使用“按引用传递”。这个想法是你操作参数的值,而不是参数本身。
这意味着传递参数的临时副本,其生命周期受到函数范围的限制。
答案 1 :(得分:0)
是的,这是正确的。我认为你的意思是在第一种情况下它是对f
的引用而不是对foo
的引用。与第二种情况相同,您将副本传递给f
而不是f
本身。