Jaka jest różnica między: Uchwyt, wskaźnik i odniesienie

Czym różni się uchwyt od wskaźnika do obiektu i dlaczego nie możemy mieć odniesienia do odniesienia?

Author: quantum231, 2012-10-23

4 answers

Uchwyt jest zwykle nieprzezroczystym odniesieniem do obiektu. Typ uchwytu nie jest powiązany z opisywanym elementem. Rozważmy na przykład deskryptor pliku zwracany przez wywołanie systemowe open(). Typ jest int, ale reprezentuje wpis w tabeli otwartych plików. Rzeczywiste dane przechowywane w tabeli nie są powiązane z int, które zostało zwrócone przez open(), uwalniając implementację od konieczności zachowania zgodności (tzn. rzeczywista tabela może być refakturowana w sposób przejrzysty bez wpływanie na kod użytkownika. Uchwyty mogą być używane tylko przez funkcje w tym samym interfejsie biblioteki, które mogą ponownie zamapować uchwyt z powrotem do rzeczywistego obiektu.

Wskaźnik jest kombinacją adresu w pamięci i typu obiektu, który znajduje się w tej lokalizacji pamięci. Wartością jest adres, typ wskaźnika mówi kompilatorowi, jakie operacje mogą być wykonywane przez ten wskaźnik, jak zinterpretować położenie pamięci. Wskaźniki są przezroczyste w tym, że obiekt, do którego odnosi się ma konkretny typ, który jest obecny ze wskaźnika. Zauważ, że w niektórych przypadkach wskaźnik może służyć jako uchwyt ({[4] } jest całkowicie nieprzezroczysty, wskaźnik do pustego interfejsu jest tak samo nieprzezroczysty).

Odniesienia są aliasami do obiektu. Dlatego nie można mieć odwołania do odwołania: można mieć wiele aliasów dla obiektu, ale nie można mieć aliasu aliasu. Podobnie jak w przypadku wskaźników wpisywane są odniesienia. W pewnych okolicznościach odwołania mogą być implementowane przez kompilator jako wskaźniki, które są automatycznie dereferowane przy użyciu, w niektórych innych przypadkach kompilator może mieć odniesienia, które nie mają rzeczywistego miejsca na dysku. Ważne jest to, że są one aliasami do obiektu, muszą być zainicjalizowane obiektem i nie mogą być ponownie nagrane, aby odnosić się do innego obiektu po ich zainicjowaniu. Po ich zainicjowaniu wszystkie zastosowania referencji są zastosowaniami rzeczywistego obiektu.

 27
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 04:16:07

Aby nawet Zadać pytanie: "dlaczego nie możemy mieć odniesienia do odniesienia?"oznacza, że nie rozumiesz, co to jest odniesienie .

Odniesienie to inna nazwa obiektu; nic więcej. Jeśli mam obiekt zapisany w zmiennej X, mogę utworzyć zmienną Y, która jest odniesieniem do tego obiektu. Obaj mówią o tym samym obiekcie, więc co dokładnie oznacza odniesienie do Y? Nie różniłoby się to niczym od odniesienia do X, ponieważ wszystkie są odwołując się do tego samego.

"uchwyt" nie ma definicji w języku C++. Ogólnie rzecz biorąc, "uchwyt" jest konstrukcją jakiejś formy, która reprezentuje pewien rodzaj zasobu. Otrzymujesz go z jakiegoś API, które tworzy zasób. Wywołujesz funkcje, które przyjmują uchwyt jako parametr w celu zapytania stanu zasobu lub zmodyfikowania go. A kiedy skończysz z tym, przekazujesz go do innej funkcji API.

Wskaźnik może być uchwyt. Odniesienie może być uchwytem. Przedmiot może być uchwytem. Liczba całkowita może być uchwytem. Wszystko zależy od tego, co system, który implementuje uchwyt, chce z nim zrobić.

 11
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 04:15:13

A handle jest również czasami nazywany "magicznym ciastkiem". To tylko wartość jakiegoś nieprzezroczystego typu, który identyfikuje obiekt. W niektórych przypadkach jest zaimplementowany jako rzeczywisty wskaźnik, więc jeśli rzucisz go na wskaźnik do właściwego typu, możesz go dereferować i pracować z dowolnym rodzajem rzeczy, na które wskazuje.

W innych przypadkach zostanie zaimplementowany jako coś innego niż wskaźnik-na przykład możesz mieć tabelę obiektów tego typu, A uchwyt jest tak naprawdę tylko indeksem do tego stolik. Jeśli nie znasz adresu bazowego tabeli, nie możesz nic zrobić z indeksem.

C++ po prostu mówi, że odniesienia do referencji nie są możliwe. Nie ma zbyt wiele na drodze do "dlaczego" - gdyby tak bardzo chcieli, bez wątpienia mogliby na to pozwolić (podobnie jak tablice odniesień, jeśli o to chodzi). Zapadła jednak decyzja, że najlepiej ograniczyć odniesienia (dużo), tak właśnie zrobili.

 6
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 04:16:38

Różnicą jest kontekst.

Podstawowe znaczenie uchwytu polega na tym, że odnosi się on do jakiegoś obiektu w bardzo ograniczonym kontekście; np. System Operacyjny może przechowywać tylko 20 plików otwartych dla użytkownika lub pid. Wskaźnik odnosi się do tego samego obiektu w kontekście "pamięci". A Referencja jest "aliasem" do obiektu-odnosi się do obiektu w kontekście kodu źródłowego; w związku z tym odniesienie do odniesienia nie istnieje, ponieważ odniesienie już "jest" obiektem.

 2
Author: Aki Suihkonen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-23 04:13:51