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 &)では、ローカル オブジェクトへの非 const 参照を返し、aamain はローカル参照と同じメモリ アドレスを取得します。したがって、これには、ローカル参照の有効期間をその範囲を超えて延長する効果があります。

Q3. 内部では、最初に経由してから経由して、複数回A::add(A &)逆参照します。どちらの場合も、メモリ アドレスは常に同じです。これはどのように起こっていますか?内部の出力と結果を確認できます*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: in main がinとは異なる新しい *a を作成しましA* a = new A()た。in main は変数によって参照されますaaA::addaz

A2:いいえ、ヒープ上に作成したので、その変数aを呼び出すまで続きます。delete

A3:逆参照は、ポインターに格納されているメモリの場所を変更しません。その場所に格納されている値を取得するだけです。参照はエイリアスに似ています。そう&b言っているようなものです&(*a)

于 2013-10-22T17:11:26.307 に答える