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++
Odpowiedz
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:
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?
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
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.
z wyjątkiem sytuacji, gdy ktoś zwróci wartość nullptr;) –
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
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 ->
.
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
.
- 1. C++ - funkcja, która zwraca obiekt
- 2. Kiedy funkcja Double.ToString() zwraca wartość w notacji naukowej?
- 3. Kiedy Registry.CreateSubKey zwraca zero?
- 4. Odwołanie do odniesienia w C++
- 5. Utwórz odwołanie do podagray w języku C# (przy użyciu niebezpiecznych?)
- 6. Dlaczego operator przypisania zwraca przypisaną wartość w języku C#?
- 7. Jak funkcja zwraca wskaźnik do funkcji? (C++)
- 8. zwraca "to" w C++?
- 9. Funkcja 'noreturn' zwraca
- 10. Funkcja zwraca tablicę BYTE
- 11. Kiedy ThreadPool.QueueUserWorkItem zwraca false
- 12. Czy istnieje już funkcja warunkowego Zip w języku C#?
- 13. Co zwraca funkcja dojo.query()?
- 14. VBScript: Funkcja zwraca tablicę
- 15. C# odwołanie do pulpitu
- 16. funkcja Python zwraca None
- 17. Funkcja wbudowana (kiedy wstawić)?
- 18. Kiedy jest wywołany konstruktor statyczny w języku C#?
- 19. Kiedy jest typ ogólny rozwiązany w języku C#?
- 20. Kulturowa funkcja ParseFloat w języku JavaScript?
- 21. Funkcja opcode w C
- 22. W języku C++, funkcja wektorowa push_back zwiększy rozmiar pustej tablicy?
- 23. Szybka funkcja skrótu dla napisu w języku C#
- 24. Czy funkcja ma jakąś klasę pamięci w języku C?
- 25. Sprawdź, czy funkcja jest w języku C lub Lua zaimplementowana
- 26. Czy funkcja konstruktora może być przyjacielem w języku C++?
- 27. Safehandle w języku C#
- 28. Przechowuj odwołanie do typu pierwotnego w języku Python?
- 29. Kiedy mysql_query zwraca wartość false
- 30. Funkcja pakietu Perla ("V") w języku Python?
nie jest wskaźnikiem odniesienia? –
@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
Zastanów się, w jaki sposób zaimplementujesz operatora indeksu dolnego, powiedzmy "wektor", bez zwracania odwołania. – jrok