Obiekty tymczasowe
Obiekt tymczasowy to nienazwany obiekt utworzony przez kompilator do przechowywania wartości tymczasowej.
Uwagi
W niektórych przypadkach kompilator musi utworzyć obiekty tymczasowe. Takie obiekty tymczasowe mogą być utworzone z następujących powodów:
Aby zainicjować
const
odwołanie za pomocą inicjatora typu innego niż źródłowy typ inicjowanego odwołania.Aby przechowywać wartość zwracaną funkcji zwracającej typ zdefiniowany przez użytkownika (UDT). Te tymczasowe operacje są tworzone tylko wtedy, gdy program nie kopiuje wartości zwracanej do obiektu. Przykład:
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.
Ponieważ wartość zwracana nie jest kopiowana do innego obiektu, tworzony jest obiekt tymczasowy. Częstszy przypadek tworzenia obiektów tymczasowych występuje w trakcie obliczania wyrażenia, w którym muszą zostać wywołane funkcje przeciążonego operatora. Te przeciążone funkcje operatora zwracają typ zdefiniowany przez użytkownika, który często nie jest kopiowany do innego obiektu.
Rozważ wyrażenie
ComplexResult = Complex1 + Complex2 + Complex3
. Obliczane jest wyrażenieComplex1 + Complex2
, a wynik jest przechowywany w obiekcie tymczasowym. Następnie wyrażenie tymczasowe+ Complex3
jest obliczane, a wynik jest kopiowany doComplexResult
(przy założeniu, że operator przypisania nie jest przeciążony).Aby przechować wynik rzutowania na typ zdefiniowany przez użytkownika. Gdy obiekt danego typu jest jawnie konwertowany na typ zdefiniowany przez użytkownika, nowy obiekt jest konstruowany jako obiekt tymczasowy.
Obiekty tymczasowe mają okres istnienia zdefiniowany przez ich punkt tworzenia i punkt ich zniszczenia. Każde wyrażenie tworzące więcej niż jeden obiekt tymczasowy ostatecznie niszczy je w odwrotnej kolejności tworzenia.
W przypadku wystąpienia tymczasowego zniszczenia zależy od sposobu jego użycia:
Tymczasowe używane do inicjowania
const
odwołań:
Jeśli inicjator nie jest wartością l tego samego typu co zainicjowane odwołanie, zostanie utworzony tymczasowy typ obiektu bazowego. Jest inicjowany przez wyrażenie inicjalizacji. Ten obiekt tymczasowy jest niszczony natychmiast po tym, jak obiekt referencyjny, do którego jest powiązany. Ponieważ to zniszczenie może się zdarzyć również po wyrażeniu, które utworzyło tymczasowe, czasami jest określane jako rozszerzenie okresu istnienia.Tymczasowo utworzone jako efekt oceny wyrażeń:
Wszystkie czasy, które nie mieszczą się w pierwszej kategorii i które są tworzone jako efekt oceny wyrażenia, są niszczone na końcu instrukcji wyrażenia (czyli na średnik) lub na końcu wyrażeń sterujących dlafor
,if
,while
,do
iswitch
instrukcji.
Zobacz też
Blog Herb Sutter na temat odwołań, po prostu
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla