C++. Как происходит возвращение локального объекта функциями? Читаю про конструктор копии. Про передачу аргументов в функцию разобрался, а вот с возвращением локального объекта функцией, запутался.
Есть простой код:#include
using namespace std;
class samp {
public:
int a; //Данные объекта
samp()
{cout << "Конструктор стработал!" << endl;}
~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
163 +1
0
Ответы
1

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

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

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

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

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

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир