何が起こったのかを説明する最も簡単な方法は次のとおりです。
main() で文字列を作成し、それをコンストラクターに渡しました。この文字列インスタンスは、コンストラクター内にのみ存在していました。コンストラクター内で、このインスタンスを直接指すようにメンバーを割り当てました。スコープがコンストラクターを離れたときに、文字列インスタンスが破棄され、メンバーが存在しなくなった文字列オブジェクトを指していました。Sandbox.member がそのスコープ外の参照を指すようにしても、これらの外部インスタンスはスコープ内に保持されません。
希望する動作を表示するようにプログラムを修正する場合は、次の変更を行います。
int main()
{
string temp = string("four");
Sandbox sandbox(temp);
cout << sandbox.member << endl;
return 0;
}
temp は、コンストラクターの最後ではなく、main() の最後でスコープ外に渡されるようになりました。ただし、これは悪い習慣です。メンバー変数は、インスタンスの外部に存在する変数への参照であってはなりません。実際には、その変数がいつスコープ外になるかはわかりません。
私がお勧めするのは、Sandbox.member を として定義することです。const string member;
これにより、メンバー変数を一時パラメーター自体として割り当てる代わりに、一時パラメーターのデータがメンバー変数にコピーされます。