我对以下代码有几个问题
#include <iostream>
using namespace std;
class A
{
public:
A & add(A & b);
};
A & A::add(A & z)
{
A * a = new A();
A & b = *a;
cout << "Inside add, address of a: " << &a << endl;
cout << "Inside add, address of b: " << &b << endl;
cout << "Inside add, address of z: " << &z << endl;
A aa;
cout << "Inside, add, address of aa: " << &aa << endl;
return aa;
}
int main()
{
A *a = new A();
cout << "Original a: " << a << endl;
A & b = a->add(*a);
cout << "b: " << &b << endl;
return 0;
}
Q1。在 main 第 3 行,a->add(*a)
传递了指针 *a 指向的同一个对象。但是在函数内部A::add(A &)
,当我尝试通过 实现相同的效果时A &b = *a
,我得到了一个不同的对象。为什么会这样?
Q2。在内部A::add(A &)
,我返回一个对本地对象的非常量引用,aa
并且 main 获得与本地引用相同的内存地址。因此,这具有将本地引用的生命周期延长到其范围之外的效果。
Q3。在里面,我多次A::add(A &)
取消引用,首先是 via ,然后是 by 。在这两种情况下,内存地址总是相同的。这是怎么回事?您可以检查inside的输出和结果*a
A &b = *a
return *a
&b
A::add(A &)
A &b = a->add(*a)
更新:
与 Q1 相关的问题是我在做
cout << &a
,我应该做的时候cout << a
为了消除返回值优化,我使用 -fno-elide-constructors 进行编译。我正在使用 g++。