我一直在阅读 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 不会指向已删除的引用,因为将保留局部变量。我是否正确理解了这一点?