Zwracanie funkcji typu odwołania
Funkcje można zadeklarować w celu zwrócenia typu odwołania. Istnieją dwa powody, aby złożyć taką deklarację:
Zwracane informacje są wystarczająco dużym obiektem, który zwraca odwołanie jest bardziej wydajny niż zwracanie kopii.
Typ funkcji musi być wartością l.
Obiekt, do których odwołuje się, nie będzie wykraczał poza zakres, gdy funkcja zwróci wartość .
Podobnie jak w przypadku bardziej wydajnego przekazywania dużych obiektów do funkcji według odwołania, bardziej wydajne może być również zwracanie dużych obiektów z funkcji według odwołań. Protokół odwołania zwrotnego eliminuje konieczność kopiowania obiektu do lokalizacji tymczasowej przed zwróceniem.
Typy zwracane odwołania mogą być również przydatne, gdy funkcja musi zostać obliczona na wartość l. Większość przeciążonych operatorów należy do tej kategorii, szczególnie operatora przypisania. Przeciążone operatory są objęte operatorami przeciążonym.
Przykład
Rozważmy Point
przykład:
// refType_function_returns.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Point
{
public:
// Define "accessor" functions as
// reference types.
unsigned& x();
unsigned& y();
private:
// Note that these are declared at class scope:
unsigned obj_x;
unsigned obj_y;
};
unsigned& Point :: x()
{
return obj_x;
}
unsigned& Point :: y()
{
return obj_y;
}
int main()
{
Point ThePoint;
// Use x() and y() as l-values.
ThePoint.x() = 7;
ThePoint.y() = 9;
// Use x() and y() as r-values.
cout << "x = " << ThePoint.x() << "\n"
<< "y = " << ThePoint.y() << "\n";
}
Dane wyjściowe
x = 7
y = 9
Zwróć uwagę, że funkcje x
i y
są deklarowane jako zwracane typy odwołań. Te funkcje mogą być używane po obu stronach instrukcji przypisania.
Należy również pamiętać, że w obszarze głównym obiekt programu ThePoint pozostaje w zakresie, dlatego jego składowe odwołania są nadal aktywne i mogą być bezpiecznie dostępne.
Deklaracje typów odwołań muszą zawierać inicjatory z wyjątkiem następujących przypadków:
Jawna
extern
deklaracjaDeklaracja składowej klasy
Deklaracja w klasie
Deklaracja argumentu funkcji lub zwracanego typu dla funkcji
Uwaga zwracająca adres lokalny
Jeśli zadeklarujesz obiekt w zakresie lokalnym, ten obiekt zostanie zniszczony po powrocie funkcji. Jeśli funkcja zwróci odwołanie do tego obiektu, odwołanie to prawdopodobnie spowoduje naruszenie dostępu w czasie wykonywania, jeśli obiekt wywołujący spróbuje użyć odwołania o wartości null.
// C4172 means Don't do this!!!
Foo& GetFoo()
{
Foo f;
...
return f;
} // f is destroyed here
Kompilator generuje ostrzeżenie w tym przypadku: warning C4172: returning address of local variable or temporary
. W prostych programach istnieje możliwość, że od czasu do czasu nie nastąpi naruszenie dostępu, jeśli odwołanie jest dostępne przez obiekt wywołujący przed zastąpieniem lokalizacji pamięci. Wynika to z owego szczęścia. Heed ostrzeżenie.
Zobacz też
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