Вот самый простой способ объяснить, что произошло:
В 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;
Это позволит скопировать данные временного параметра в переменную-член вместо назначения переменной-члена в качестве самого временного параметра.