Sdílet prostřednictvím


Vrácení funkce typu odkazu

Funkce mohou být deklarovány, aby vracely typ odkazu. Existují dva důvody pro tuto deklaraci:

  • Vrácené informace jsou dostatečně velkým objektem, takže vrácení odkazu je efektivnější než vrácení kopie.

  • Typ funkce musí být l-hodnota.

  • Odkazovaný objekt nebude při vrácení funkce mimo rozsah.

Stejně jako může být efektivnější předat velké objekty funkcím odkazem, může být také efektivnější vracet velké objekty z funkcí odkazem. Protokol vrácení odkazu eliminuje nutnost kopírování objektu do dočasného umístění před vrácením.

Typy vracející odkaz mohou být také užitečné, když se funkce musí vyhodnotit na l-hodnotu. Nejvíce přetížených operátorů patří do této kategorie, zejména operátor přiřazení. Přetížené operátory jsou pokryty přetíženými operátory.

Příklad

Vezměte v úvahu příklad typu Point:

// 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";
}

Výstup

x = 7
y = 9

Všimněte si, že funkce x a y jsou deklarovány, aby vracely odkazy. Tyto funkce lze použít na obou stranách příkazu přiřazení.

Všimněte si také, že objekt ThePoint zůstává v oboru, a proto jeho referenční členy jsou stále aktivní a mohou být bezpečně přístupné.

Deklarace odkazů musí obsahovat inicializátory s výjimkou těchto případů:

  • Explicitní extern deklarace

  • Deklarace členu třídy

  • Deklarace v rámci třídy

  • Deklarace argumentu funkce nebo návratového typu funkce

Upozornění na vrácení adresy místního prostředí

Pokud deklarujete objekt v místním oboru, tento objekt bude zničen při vrácení funkce. Pokud funkce vrátí odkaz na tento objekt, tento odkaz pravděpodobně způsobí narušení přístupu za běhu, pokud se volající pokusí použít odkaz null.

// C4172 means Don't do this!!!
Foo& GetFoo()
{
    Foo f;
    ...
    return f;
} // f is destroyed here

Kompilátor v tomto případě vydá upozornění: warning C4172: returning address of local variable or temporary. V jednoduchých programech je možné, že občas nedojde k narušení přístupu v případě, že se volající dostane k odkazu před přepsáním umístění paměti. To je kvůli štěstí. Chytli se varování.

Viz také

Odkazy