C++ 中的引用让我感到困惑。 :)
基本思想是我试图从函数中返回一个对象。我想在不返回指针的情况下执行此操作(因为那时我必须手动 delete
它),并且如果可能的话不调用复制构造函数(为了提高效率,自然 添加: 也是因为我想知道我是否不能避免编写一个复制构造函数)。
所以,总而言之,以下是我找到的执行此操作的选项:
- 函数返回类型可以是类本身(
MyClass fun() { ... }
)或对类的引用(MyClass& fun() { ... }
)。 - 函数既可以在返回行构造变量(
return MyClass(a,b,c);
),也可以返回现有变量(MyClass x(a,b, c); 返回 x;
). - 接收变量的代码也可以有任一类型的变量:(
MyClass x = fun();
orMyClass& x = fun();
) - 接收变量的代码可以动态创建一个新变量 (
MyClass x = fun();
) 或将其分配给现有变量 (MyClass x; x =乐趣();
)
还有一些想法:
- 返回类型
MyClass&
似乎是个坏主意,因为这总是会导致变量在返回之前被销毁。 - 复制构造函数似乎只在我返回现有变量时参与。当返回在 return 行中构造的变量时,它永远不会被调用。
- 当我将结果分配给现有变量时,析构函数也总是在返回值之前启动。此外,没有调用复制构造函数,但目标变量确实接收从函数返回的对象的成员值。
这些结果如此不一致,以至于我感到完全困惑。那么,这里到底发生了什么?我应该如何正确地从函数构造和返回对象?
最佳答案
在 C++ 中理解复制的最佳方式通常不是试图生成一个人为的示例并对其进行检测 - 允许编译器删除和添加复制构造函数调用,或多或少是它认为合适的。
底线——如果你需要返回一个值,就返回一个值,不要担心任何“费用”。
关于C++:通过引用和复制构造函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273811/