假设我有一个名为 Myobj
的对象,并且该对象具有所有默认值(复制 cstr、移动 cstr、赋值和 cpy 赋值)。现在假设有这样的方法
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
的复制构造函数被调用。 cpy cnstr 是 foo::foo(const foo& f)
。所以 incase of the statement
fooB(someobject);
等同于函数 as
void fooB(foo f){..} gives fooB f (someobject); //Cpy constr is called
请让我知道我的回答和理解是否正确
最佳答案
是的,但是 IMO 你的措辞很奇怪,或者你可能让事情变得过于复杂了。
第二个签名使用“按值传递”方法。与第一个示例相反,这里使用了“按引用传递”。这个想法是您对参数的值进行操作,而不是对参数本身进行操作。
这意味着创建了传递参数的临时拷贝,其生命周期受函数范围的限制。
关于c++ - 为什么在这种情况下不调用复制构造函数 - 我的推理是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23597112/