C++:按引用返回到按值返回

标签 c++ pass-by-reference

我一直在阅读 Myers 的书,并偶然发现了关于按引用/指针与按值返回的项目。 重点是,如果我们的函数是这样的:

ClassA& AddSomething(ClassA classA)
{
  ClassA tempClassA;
  //... do something on tempClassA
  return tempClassA;
}

这是行不通的,因为我们正在返回对在堆栈上创建的对象的引用,并且在函数完成后它已经死了。

他给出了两种解决方案:

  1. 在函数内部使用局部静态 ClassA。这有其 问题,但至少我们可以确定该对象存在。
  2. 作为对象返回:

    ClassA AddSomething(ClassA classA)
    {
      ClassA tempClassA;
      //... do something on tempClassA
      return tempClassA;
    }
    

现在如果我要做:

ClassA obj1;
ClassA obj2 = AddSomething(obj1);

我现在的困惑是,当执行这一行时:

  1. 制作 tempClassA 的“拷贝”并将其传递给复制构造函数 ClassA(初始化obj2)?或者
  2. tempClassA 将自身传递给 ClassA 的复制构造函数, 因为复制构造函数需要引用。

所以基本上,传递给复制构造函数的是对 tempClassA 的引用(它是在函数内部的堆栈中创建的)或对 tempClassA 拷贝的引用。

此外,我的另一个问题是,我读到如果我获得函数局部变量的引用,在这种情况下局部变量将不会被删除。 例如,

ClassA & classRef = AddSomething(obj1);

在这种情况下,如果 AddSomething() 返回一个引用,则 classRef 不会指向已删除的引用,因为局部变量将被保留。我的理解正确吗?

最佳答案

在最坏的情况下,您是对的:tempClassA 的拷贝被传递给复制构造函数。但是允许编译器删除该拷贝并在适当的位置构造结果 tempClassA。这称为“返回值优化”或 RVO。我不知道哪个编译器不这样做。

关于C++:按引用返回到按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198770/

相关文章:

c++ - 为什么 istream、ostream、iostream、ios_base 都在这里工作

C++:奇怪的 vector 行为

c++ - 我们能否在运行时确定两个 type_info 是否可转换?

如果在函数调用中分配了 var,PHP 将忽略通过引用传递

c++ - 为什么下面的代码在通过引用传递时不显示错误

java - Java中的对象交换

c++ - 为什么链接为 *.a 静态库时 "WinMain"未解析?

c++ - 使用自定义分配器计算内存使用情况

Java:如何通过引用传递字节 []?

javascript - JavaScript 是按引用传递还是按值传递语言?