Временные объекты
В некоторых случаях компилятору необходимо создавать временные объекты. Такие объекты могут создаваться по следующим причинам.
Для инициализации ссылки 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-значение того же типа, что и инициализируемая ссылка, создается временный объект базового типа объекта, инициализируемый выражением инициализации. Этот временный объект удаляется сразу после удаления объекта ссылки, с которым он связан. |