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;
ОС никаких ошибок не выдавала.
Вообщем, помогите пожалуйста разобратся, я запутался :(

21 Авг 2019 в 07:01
131 +1
0
Ответы
1

При использовании указателя в вашем коде, вы действительно получаете указатель на временный объект, который после завершения функции func() будет уничтожен.

Это может привести к непредсказуемому поведению вашей программы, так как вы обращаетесь к объекту, который уже не существует.

Использование указателей для работы с временными объектами не является хорошей практикой и может привести к ошибкам. Лучше всегда создавать объекты напрямую, как в первом варианте вашего кода, или использовать ссылки.

Если вам действительно нужно использовать указатель, вам нужно будет копировать данные из временного объекта в новый объект по указателю до его уничтожения.

Надеюсь, это поможет вам разобраться с вашей проблемой. Если у вас еще остались вопросы, не стесняйтесь задавать их.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир