C++:通过引用和复制构造函数返回

标签 c++ reference return-value-optimization return-by-reference

C++ 中的引用让我感到困惑。 :)

基本思想是我试图从函数中返回一个对象。我想在不返回指针的情况下执行此操作(因为那时我必须手动 delete 它),并且如果可能的话不调用复制构造函数(为了提高效率,自然 添加: 也是因为我想知道我是否不能避免编写一个复制构造函数)。

所以,总而言之,以下是我找到的执行此操作的选项:

  • 函数返回类型可以是类本身(MyClass fun() { ... })或对类的引用(MyClass& fun() { ... } )。
  • 函数既可以在返回行构造变量(return MyClass(a,b,c);),也可以返回现有变量(MyClass x(a,b, c); 返回 x;).
  • 接收变量的代码也可以有任一类型的变量:(MyClass x = fun(); or MyClass& x = fun();)
  • 接收变量的代码可以动态创建一个新变量 (MyClass x = fun();) 或将其分配给现有变量 (MyClass x; x =乐趣();)

还有一些想法:

  • 返回类型 MyClass& 似乎是个坏主意,因为这总是会导致变量在返回之前被销毁。
  • 复制构造函数似乎只在我返回现有变量时参与。当返回在 return 行中构造的变量时,它永远不会被调用。
  • 当我将结果分配给现有变量时,析构函数也总是在返回值之前启动。此外,没有调用复制构造函数,但目标变量确实接收从函数返回的对象的成员值。

这些结果如此不一致,以至于我感到完全困惑。那么,这里到底发生了什么?我应该如何正确地从函数构造和返回对象?

最佳答案

在 C++ 中理解复制的最佳方式通常不是试图生成一个人为的示例并对其进行检测 - 允许编译器删除和添加复制构造函数调用,或多或少是它认为合适的。

底线——如果你需要返回一个值,就返回一个值,不要担心任何“费用”。

关于C++:通过引用和复制构造函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273811/

相关文章:

c++ - 如果在这些写入之后没有代码,为什么 C++ 编译器只会消除无用的写入?

java - 正确访问父级方法和变量?

C++ 未定义对带有队列参数的函数的引用

c# - 找不到类型或命名空间名称

c++ - 使用 `reinterpret_cast` 调用非静态成员函数而不实例化

c++ - 在 C++ 中作为参数传递给函数时,const string & str 和 string const & str 有什么区别

c++ - Python 列表和 c/c++ 数组

c++ - 按值返回时强制 RVO/移动构造

c++ - C中的返回值优化和复制省略

c++ - 在没有返回值优化的情况下将两个对象相加会创建多少个临时对象?