• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Referencje - podstawowe pytania

Cloud VPS
+1 głos
427 wizyt
pytanie zadane 10 sierpnia 2018 w C i C++ przez Agnes Użytkownik (990 p.)

Nie wiem, czy dobrze rozumiem podstawowe aspekty referencji, proszę, aby ktoś skomentował, czy w tych dwóch "teoriach" są błędy i poprawił je, jeśli tak jest.

Dlaczego referencje nie mogę być zmieniane (Czy tak jest w każdym języku programowania?):

Nazwa referencji symbolizuje pewien adres w pamięci pod którym "siedzi" dany obiekt. Jeśli zmienimy nazwę referencji to ona nie będzie już symbolizować tego samego adresu tylko inny, w którym nie ma tego samego obiektu, dlatego gdyby takie działanie było dozwolone konsekwencje tego byłyby nieprzewidywalne.

A powód dla którego trzeba koniecznie inicjalizować referencję zaraz po deklaracji:

Deklarując referencję tworzymy odnośnik do pewnego miejsca w pamięci. Jeśli nie powiemy programowi jasno jaki obiekt ma zostać przypisany do tego adresu a następnie będziemy kontynuować pisanie programu wówczas w to miejsce zostanie wpisany kolejno utworzony obiekt (jeśli miejsca w pamięci są zapełniane jedno po drugim - jest tak?) lub pozostanie w nim obiekt, który wcześniej się na nim znajdował.

Przy okazji ciekawią mnie też odpowiedzi na pytania w nawiasach.

3 odpowiedzi

+1 głos
odpowiedź 15 sierpnia 2018 przez mokrowski Mędrzec (158,980 p.)
Oczywiście można strzępić sobie język że wskaźnik to zakamuflowany typ opcjonalny, udowadniać że referencję da się ustawić nieprawidłowo (bo da się), znęcać się nad R-Referencją. Może lepiej jednak przeczytać z uwagą:

https://en.cppreference.com/w/cpp/language/reference_initialization

oraz

https://en.cppreference.com/w/cpp/language/reference

To naprawdę wystarczy. Są przykłady wiszących referencji (ang. dangling reference), przekazywania referencji (również forward).
0 głosów
odpowiedź 10 sierpnia 2018 przez profesorek96 Szeryf (91,400 p.)
Zanim odpowiem ci na pytanie musze cię uświadomić, język C++ ma swoje kożenie w C. W jezyku C było coś takiego jak wskaźniki. Język C++ że jest kompatybilny wstecznie ma również mechanizm wskaźników. Jednak operacje na wskaźnikach nie są proste i prowadzą do błędów. Między innymi jeden wskaźnik można "przestawiać" by wskazywał na różne adresy co może powodować błędy. Dlatego właśnie wymyślono referencje by można było operować na pamięci ale by ta operacja była znacznie prostsza i trudniej było popełniać błędy.
0 głosów
odpowiedź 10 sierpnia 2018 przez Wiciorny Ekspert (281,530 p.)

Referencja jest praktycznie stałym wskaźnikiem (nie mylić ze wskaźnikiem do stałej wartości), tzn. nie da się zmienić miejsca w pamięci na który wskazuje, oraz nie może być nullem. Dodatkowo składnia jest identyczna jak posługiwanie się zmiennymi zaalokowanymi na stosie, co dodatkowo lepiej przekazuje intencję programisty. Przekazywanie argumentów funkcji przez referencję (z atrybutem const kiedy można) jest preferowanym sposobem przekazywania wszystkich obiektów, praktycznie umożliwia programowanie obiektowe. Dodatkowo wydaje mi się, że referencje pozwalają na więcej optymalizacji kompilatora niż wskaźniki (jak ktoś wie na ten temat coś więcej to proszę o wypowiedzenie się). 

wskaźniki to zmienne mogące trzymać adres, a referencja to adres do czegoś tam nie będący L-Wartością.

L* lewą wartością

 

jeśli miejsca w pamięci są zapełniane jedno po drugim

no są, ale to czy obiekt trafi jeden po drugim od tego nie zależy, bo to zależy od wielkości obiektu np... i tego ile pamięci zajmuje z obecnym stanem np.  

Podobne pytania

0 głosów
0 odpowiedzi 139 wizyt
+1 głos
1 odpowiedź 286 wizyt
pytanie zadane 24 lutego 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
0 głosów
1 odpowiedź 1,245 wizyt
pytanie zadane 20 marca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...