关于以下代码我几乎没有问题
#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
的非const引用,并且main获取与本地引用相同的内存地址。因此,这可以延长本地参考的寿命,超出其范围。
Q3。在A::add(A &)
内,我多次取消引用*a
,首先是A &b = *a
,然后是return *a
。在这两种情况下,内存地址始终相同。这是怎么回事?您可以查看&b
内A::add(A &)
的输出和A &b = a->add(*a)
的结果
更新:
与Q1相关的问题是我正在做cout << &a
,当我应该做cout << a
为了消除返回值优化,我用-fno-elide-constructors编译。我正在使用g ++。
答案 0 :(得分:2)
A1:您使用A* a = new A()
创建了一个新的* a。[main]中的a
与a
中的A::add
不同。 main中的a
由变量z
A2:不,你在堆上创建了a
,所以它会持续到你在该变量上调用delete
A3:取消引用不会更改指针中存储的内存位置,只会获取存储在该位置的值。引用更像是别名。所以&b
就像在说&(*a)