0

我对以下代码有几个问题

#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的输出和结果*aA &b = *areturn *a&bA::add(A &)A &b = a->add(*a)

更新:

  1. 与 Q1 相关的问题是我在做cout << &a,我应该做的时候cout << a

  2. 为了消除返回值优化,我使用 -fno-elide-constructors 进行编译。我正在使用 g++。

4

1 回答 1

2

A1:您创建了一个新的 *a ,A* a = new A()其中in main 与ina不同。in main被变量引用aA::addaz

A2:不,你是a在堆上创建的,所以它会一直持续到你调用delete那个变量

A3:取消引用不会更改存储在指针中的内存位置,它只是获取存储在该位置的值。引用更像是别名。所以&b就像说&(*a)

于 2013-10-22T17:11:26.307 回答