Udostępnij za pośrednictwem


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 deklaracja

  • Deklaracja 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ż

Odwołania