Dočasné objekty
V některých případech je pro kompilátor nezbytné vytvořit dočasné objekty.Tyto dočasné objekty mohou být vytvořeny z následujících důvodů:
Inicializace odkazu const s inicializátorem typu odlišného od základního typu inicializovaného odkazu.
Uložení návratové hodnoty funkce, která vrací uživatelem definovaný typ.Tyto dočasné objekty jsou vytvořeny pouze v případě, že program nekopíruje hodnotu vrácenou objektu.Příklad:
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.
Protože vrácená hodnota není do jiného objektu zkopírována, je vytvořen dočasný objekt.Častější případ, kdy jsou dočasné objekty vytvořeny je při vyhodnocení výrazu, kde musí být volány funkce přetíženého operátoru.Tyto funkce přetíženého operátoru vrátí uživatelem definovaný typ, který často není zkopírován do jiného objektu.
Zvažte výraz ComplexResult = Complex1 + Complex2 + Complex3.Výraz Complex1 + Complex2 je vyhodnocen a výsledek je uložen v dočasném objektu.Dále je vyhodnocen výraz temporary + Complex3 a výsledek je zkopírován do proměnné ComplexResult (za předpokladu, že operátor přiřazení není přetížen).
K uložení výsledku přetypování do uživatelem definovaného typu.Když je objekt daného typu explicitně převeden na uživatelem definovaný typ, tento nový objekt je zkonstruován jako dočasný objekt.
Dočasné objekty mají životnost, která je definována bodem jejich vytvoření a bodem, ve kterém jsou zničeny.Libovolný výraz, který vytvoří více než jeden dočasný objekt je nakonec zničí v obráceném pořadí, než ve kterém byly vytvořeny.Body, ve kterých dochází ke zničení jsou uvedeny v následující tabulce.
Body zničení dočasných objektů
Důvod vytvoření dočasného objektu |
Bod zničení |
---|---|
Výsledek vyhodnocení výrazu |
Všechny dočasné objekty vytvořené jako výsledek vyhodnocení výrazu jsou zničeny (v místě středníku), nebo na konci kontrolních výrazů příkazů for, if, while, do a switch. |
Inicializace odkazů const |
Pokud není inicializátor l-hodnota stejného typu jako inicializovaný odkaz, je vytvořen dočasný objekt základního typu objektu a inicializován inicializačním výrazem.Tento dočasný objekt je zničen okamžitě po zničení odkazu na objekt, ke kterému je vázán. |