Русская Википедия:Временный объект

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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

Язык Си++ вызывает для них конструкторы (по потребности) и деструкторы (после исполнения выражения). Это, например, важно для объекта string_view C++17.

При инициализации массивов Си++ временный объект исчезает перед инициализацией следующего элемента.

Пример

string r = string("1") + "2" + "3";

Этот код работает таким образом (ctor — конструктор, dtor — деструктор).

string r, tmp1, tmp2, tmp3;
tmp1.ctor("1");
tmp2.ctor();
tmp2 = tmp1 + "2";
tmp3.ctor();
tmp3 = tmp2 + "3";
r.ctor(tmp3);
tmp3.dtor();
tmp2.dtor();
tmp1.dtor();

Пример, где важно время жизни объекта

std::wstring expandFileName(const std::wstring& x);       // получает полный путь. Требует нуль-терминированности — потому на входе wstring
std::wstring_view extractFilePath(std::wstring_view x);   // извлекает из пути корень + каталоги + разделитель

std::wstring tempFileName()
{
  return std::wstring(extractFilePath(expandFileName(someFile)))
             .append(L"~filename.tmp");
}

Си++ гарантирует, что временная строка Шаблон:Cpp будет уничтожена позже, чем Шаблон:Cpp, которые на ней «паразитируют», «материализуются» в другую, столь же временную строку Шаблон:Cpp.

Оптимизация возврата значений

Шаблон:Main

Шаблон:Заготовка раздела

В других языках

Практически все языки (кроме самых низкоуровневых) способны автоматически создавать временные переменные для промежуточных результатов простых типов (целый, дробный, указатель). Во многих языках (Паскаль) существует подобная система для строк. Практически все языки программирования со сбором мусора (C#, Java) выдают промежуточные результаты любого типа — ведь для них нет разницы между постоянным и временным объектом. Только C++ способен автоматически создавать промежуточные объекты произвольных типов, вызывая для них конструктор и деструктор.