Поделиться через


Временные объекты

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

  • Для инициализации ссылки const с помощью инициализатора типа, отличного от инициализатора базового типа инициализируемой ссылки.

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

    UDT Func1();    //  Declare a function that returns a user-defined
                    //   type.
    
    ...
    
    Func1();        //  Call Func1, but discard return value.
                    //  A temporary object is created to store the return
                    //   value.
    

    Поскольку возвращаемое значение не копируется в другой объект, создается временный объект. Более распространенный случай создания временных объектов — во время вычисления выражения, где требуется вызов перегруженных функций оператора. Эти перегруженные функции возвращают пользовательский тип, который часто не копируется в другой объект.

    Рассмотрим выражение ComplexResult = Complex1 + Complex2 + Complex3. Сначала вычисляется выражение Complex1 + Complex2, и результат сохраняется во временном объекте. Затем вычисляется выражение temporary + Complex3, и результат копируется в объект ComplexResult (при предположении, что оператор присваивания не перегружен).

  • Для сохранения результата приведения к пользовательскому типу. Когда объект заданного типа явно преобразуется в пользовательский тип, этот новый объект создается как временный.

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

Точки удаления временных объектов

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

Точка удаления

Результат вычисления выражения

Все временные объекты, созданные в результате вычисления выражения, удаляются в конце оператора-выражения (т. е. в месте расположения точки с запятой) или в конце управляющих выражений операторов for, if, while, do и switch.

Инициализация ссылок const

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

См. также

Ссылки

Специальные функции-члены (C++)