以下のコードに関していくつか質問があります
#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 参照を返し、aa
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++ を使用しています。