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

标签 c++

假设我有一个名为 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/

相关文章:

c++ - C++ 标准是否对 vector 赋值函数或构造函数有明确的要求?

c++ - 使用带有 remove_if 的删除

c++ - 我们如何使用重复数字进行无限循环?

C++ 程序无法构建。获取架构错误的 undefined symbol

c++ - 当程序在 Windows 中使用 C++ 运行时,如何监听/识别?

c++ - 我可以将基类的个别成员的状态更改为私有(private)吗?

c++ - for 循环帮助。在不应该的时候终止。 C++

c++ - 如何从 Windows 10 中的 UWP 控制台应用程序访问到标准输出的输出?

c++ - 理解 C++ 中的 const_cast

c++ - 如何解决 "read of non-constexpr variable ' a' is not allowed in a constant expression"with boost.hana