Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpMvTm 121 of 150 menu
◀ ▶

Временный объект в C++

Временный объект живет до конца полного выражения.

Результат функции, которую объявили с типом класса по значению, как раз такой объект: у него нет отдельного имени в вызывающем коде.

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

Запишем Box с сообщениями из конструкторов копирования и перемещения, функцию make_box и приемник take:

#include <iostream> class Box { public: int* ptr; Box() { ptr = new int[1]; ptr[0] = 5; } Box(const Box& other) { ptr = new int[1]; ptr[0] = other.ptr[0]; std::cout << "copy ctor\n"; } Box(Box&& other) noexcept { ptr = other.ptr; other.ptr = nullptr; std::cout << "move ctor\n"; } ~Box() { delete[] ptr; } }; Box make_box() { Box filled; filled.ptr[0] = 9; Box spare; spare.ptr[0] = 0; if (filled.ptr[0] > spare.ptr[0]) { return filled; } return spare; } void take(Box item) { std::cout << item.ptr[0] << "\n"; }

Сейчас передадим временный объект в функцию:

int main() { take(make_box()); return 0; }

Сделайте класс Pack с буфером из одного int, конструкторами копирования и перемещения с разными строками в std::cout. Передайте результат функции, возвращающей Pack по значению, в функцию с параметром по значению и выведите элемент буфера.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить