C ++引用复制和赋值

时间:2013-10-22 17:02:40

标签: c++

关于以下代码我几乎没有问题

#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。在这两种情况下,内存地址始终相同。这是怎么回事?您可以查看&bA::add(A &)的输出和A &b = a->add(*a)的结果

更新:

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

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

1 个答案:

答案 0 :(得分:2)

A1:您使用A* a = new A()创建了一个新的* a。[main]中的aa中的A::add不同。 main中的a由变量z

引用

A2:不,你在堆上创建了a,所以它会持续到你在该变量上调用delete

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