我一直在阅读 Myers 的书,并偶然发现了关于按引用/指针与按值返回的项目。 重点是,如果我们的函数是这样的:
ClassA& AddSomething(ClassA classA)
{
ClassA tempClassA;
//... do something on tempClassA
return tempClassA;
}
这是行不通的,因为我们正在返回对在堆栈上创建的对象的引用,并且在函数完成后它已经死了。
他给出了两种解决方案:
- 在函数内部使用局部静态 ClassA。这有其 问题,但至少我们可以确定该对象存在。
作为对象返回:
ClassA AddSomething(ClassA classA) { ClassA tempClassA; //... do something on tempClassA return tempClassA; }
现在如果我要做:
ClassA obj1;
ClassA obj2 = AddSomething(obj1);
我现在的困惑是,当执行这一行时:
- 制作 tempClassA 的“拷贝”并将其传递给复制构造函数 ClassA(初始化obj2)?或者
- tempClassA 将自身传递给 ClassA 的复制构造函数, 因为复制构造函数需要引用。
所以基本上,传递给复制构造函数的是对 tempClassA 的引用(它是在函数内部的堆栈中创建的)或对 tempClassA 拷贝的引用。
此外,我的另一个问题是,我读到如果我获得函数局部变量的引用,在这种情况下局部变量将不会被删除。 例如,
ClassA & classRef = AddSomething(obj1);
在这种情况下,如果 AddSomething() 返回一个引用,则 classRef 不会指向已删除的引用,因为局部变量将被保留。我的理解正确吗?
最佳答案
在最坏的情况下,您是对的:tempClassA
的拷贝被传递给复制构造函数。但是允许编译器删除该拷贝并在适当的位置构造结果 tempClassA
。这称为“返回值优化”或 RVO。我不知道哪个编译器不这样做。
关于C++:按引用返回到按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198770/