C++. Как происходит возвращение локального объекта функциями? Читаю про конструктор копии. Про передачу аргументов в функцию разобрался, а вот с возвращением локального объекта функцией, запутался. Есть простой код:#include using namespace std; class samp { public: int a; //Данные объекта samp() {cout >act; samp ob; ob = func(); system("pause"); //Пауза на обдумывание } while(act); system("pause"); return 0; } Вот результат: Конструктор стработал! Конструктор стработал! Деструктор стработал! Деструктор стработал! Для продолжения нажмите любую клавишу . . . Деструктор стработал! Сначала создается локальный объект в main, конструктор сработал. Вызывается функция, которая создает свой объект, конструктор сработал. После присваивания значения переменной, создается временный объект, который хранит это значение, а локальный объект удаляется, срабатывает деструктор! Затем, переменная в main, получает это значения, затирая предыдущее, а временный объект удаляется, деструктор сработал! Пауза... По завершению цикла временный объект уничтожается, деструктор так же срабатывает. Вроде все нормально. Но если поменять строчки:samp ob; ob = func(); наsamp *ob; ob = &func(); Результат становится таким: Конструктор стработал! Деструктор стработал! Деструктор стработал! Для продолжения нажмите любую клавишу . . . Объект создается только в функции, конструктор сработал. Создается временный объект, а локальный удаляется, деструктор сработал. Указатель получает адрес.. Стоп.. А какой адрес он получил, временного объекта? Временный объект уничтожается, деструктор срабатывает. Выходит, указатель получил адрес на освобожденный временный объект? Я пробовал записывать в этот объект данные ob->a = 100; ОС никаких ошибок не выдавала. Вообщем, помогите пожалуйста разобратся, я запутался :(
При использовании указателя в вашем коде, вы действительно получаете указатель на временный объект, который после завершения функции func() будет уничтожен.
Это может привести к непредсказуемому поведению вашей программы, так как вы обращаетесь к объекту, который уже не существует.
Использование указателей для работы с временными объектами не является хорошей практикой и может привести к ошибкам. Лучше всегда создавать объекты напрямую, как в первом варианте вашего кода, или использовать ссылки.
Если вам действительно нужно использовать указатель, вам нужно будет копировать данные из временного объекта в новый объект по указателю до его уничтожения.
Надеюсь, это поможет вам разобраться с вашей проблемой. Если у вас еще остались вопросы, не стесняйтесь задавать их.
При использовании указателя в вашем коде, вы действительно получаете указатель на временный объект, который после завершения функции func() будет уничтожен.
Это может привести к непредсказуемому поведению вашей программы, так как вы обращаетесь к объекту, который уже не существует.
Использование указателей для работы с временными объектами не является хорошей практикой и может привести к ошибкам. Лучше всегда создавать объекты напрямую, как в первом варианте вашего кода, или использовать ссылки.
Если вам действительно нужно использовать указатель, вам нужно будет копировать данные из временного объекта в новый объект по указателю до его уничтожения.
Надеюсь, это поможет вам разобраться с вашей проблемой. Если у вас еще остались вопросы, не стесняйтесь задавать их.