2013-08-05 18 views
5

W języku C++, w jakich scenariuszach musimy zwrócić referencję z funkcji? Rozumiem używanie referencji jako danych wejściowych funkcji, ale dla wyników funkcji, dlaczego nie możemy zwrócić wartości lub wskaźników?kiedy funkcja zwraca odwołanie w języku C++

+0

nie jest wskaźnikiem odniesienia? –

+0

@SamIam: Gdyby to było to samo i miało to samo znaczenie, dlaczego uważasz, że zostałyby one wprowadzone w języku? – ereOn

+1

Zastanów się, w jaki sposób zaimplementujesz operatora indeksu dolnego, powiedzmy "wektor", bez zwracania odwołania. – jrok

Odpowiedz

8

Referencje są używane do zapewnienia przypisania do zwracanych wartości funkcji. Brzmi dziwnie, ale na przykład operator przypisania tablicy w języku C++ jest funkcją, która faktycznie zwraca odniesienie do elementu przy parametrze indeksu, aby można było go przypisać do np.

class Array { 
public: 
    int& operator[] (const int& index); 
    ... 
}; 

Umożliwienie następującą składnię:

Array a; 
a[4] = 192; 

Zainspirowany wiecznie pomocny C++ FAQ:

https://isocpp.org/wiki/faq/references#returning-refs

+3

+1 dla odniesienia do C++ FAQ – SteveLove

+0

Dzięki. To jest przekonujący przykład. – ahala

+0

@ahala można oznaczyć jako odpowiedź, jeśli czujesz, że odpowiedziałem dokładnie na twoje pytanie? – jrs

1

Możesz zwrócić referencję, jeśli obiekt już istnieje przed wywołaniem funkcji. to nie jest problem.

Ten wpis podsumowuje to dobrze. Is the practice of returning a C++ reference variable, evil?

+1

Postrelowany omawia pytanie z drugiej strony, a nie kiedy mamy zwrócić referencje lub kiedy powracający odnośnik jest lepszy niż zwrotne wskazówki. – ahala

0

Zwrócenie odwołania z funkcji ma takie same wady i zalety, jak zwrócenie wskaźnika.

Zwrócenie referencji lub wskaźnika niezwiązanego umożliwia wywołującemu zapisywanie zmiennych członkowskich i wywoływanie funkcji składowych non const.

Jednak obiekt, o którym mowa, lepiej mieć całe życie dłużej niż dzwoniący wymaga, aby program wszedł w obszar niezdefiniowanego zachowania.

Na temat musi zwrócić referencję, jest przydatna dla cukru syntaktycznego, jak z operatorami, które, jeśli zwrotne wskaźniki wymagają od dzwoniącego do dereferencji wskaźnika.

+2

z wyjątkiem sytuacji, gdy ktoś zwróci wartość nullptr;) –

+3

Nie zgodziłbym się na to, ale to pierwsze stwierdzenie wydaje mi się zupełnie błędne. Wskaźniki i odnośniki są rzeczywiście blisko, ale są zdecydowanie różnymi zwierzętami i nie mają dokładnie takich samych zalet/wad w kontekście powrotu funkcji. – ereOn

4

Nie jestem pewien, czy są jakieś miejsca, gdzie musi zwrócić referencję.

Przeciążenie operator++() ma na myśli sprężynę, ale nadal nie ma obowiązku zwrócenia referencji. Obowiązują jednak zwykłe reguły: jeśli możesz zwrócić wskaźnik do czegoś, możesz bezpiecznie zwrócić referencję w większości przypadków. Kluczową sprawą nie jest zwracanie odniesienia do czegoś, co wykracza poza zakres - jak zmienna, która jest lokalna dla tej funkcji. Zwrócenie odwołania do *this jest dość powszechne.

Zwrócenie wartości jest wartościową rzeczą do zrobienia, ponieważ albo (A) tworzy kopię zwróconej rzeczy, albo (B) maksymalnie wykorzystuje semantykę ruchu (C++ 11) i/lub Optymalizacja wartości zwrotu (RVO on wikipedia).

Jeśli nie potrzebujesz lub nie potrzebujesz kopii, to zwracanie się przez odniesienie do typów wartości jest zwykle tym, czego potrzebujesz, ponieważ mało prawdopodobne jest, że chcesz używać wskaźnika, np. Musisz usunąć zaznaczenie zwróconej rzeczy za pomocą * lub ->.

0

Pamiętaj tylko, że musisz zwrócić referencję do obiektu, który będzie istnieć po funkcja zostanie zakończona. Na przykład, można zrobić coś takiego:

Val(X,10) = 1; 

gdzie Val jest funkcją, która zwraca (powiedzmy) odniesienie do 10 elementu na liście więc ustawienie go na 1.