Trzy różne operatory używane przez C ++ w celu uzyskania dostępu do elementów klasy lub obiektu klasy, mianowicie podwójny dwukropek ::
, kropka .
i strzałka ->
, są używane w trzech różnych scenariuszach, które są zawsze dobrze zdefiniowane. Wiedząc to pozwala natychmiast wiemy sporo na temat a
i b
po prostu patrząc na a::b
, a.b
lub a->b
, odpowiednio, w każdym kodzie patrzeć.
a::b
jest używany tylko wtedy, gdy b
należy do klasy (lub przestrzeni nazw) a
. Oznacza to, że w tym przypadku a
zawsze będzie to nazwa klasy (lub przestrzeni nazw).
a.b
jest używany tylko wtedy, gdy b
jest członkiem obiektu (lub odniesieniem do obiektu) a
. Tak więc a.b
, a
zawsze będzie to rzeczywisty obiekt (lub odniesienie do obiektu) klasy.
a->b
jest pierwotnie skrótem dla (*a).b
. Jednak ->
jest to jedyny z operatorów dostępowych członkiem które mogą być przeciążone, więc jeśli a
to obiekt klasy, która przeciążenia operator->
(wspólne takie typy są inteligentne wskaźniki i iteratory), to ich znaczenie jest cokolwiek projektant klasa realizowane. Podsumowując: Jeśli a->b
, jeśli a
jest wskaźnikiem, b
będzie członkiem obiektu, do którego a
odnosi się wskaźnik . Jeśli jednak a
jest obiektem klasy, który przeciąża tego operatora, wówczas operator->()
wywoływana jest funkcja przeciążonego operatora .
Mały druk:
- W C ++, typy zadeklarowane jako
class
, struct
lub union
są uważane za „typu klasy”. Powyższe odnosi się do wszystkich trzech z nich.
- Odniesienia są semantycznie aliasami do obiektów, dlatego też powinienem był dodać „lub odniesienie do wskaźnika” do nr 3. Pomyślałem jednak, że byłoby to bardziej mylące niż pomocne, ponieważ odniesienia do wskaźników (
T*&
) są rzadko używane.
- Operatorów kropek i strzałek można używać do odwoływania się do elementów klasy statycznej z obiektu, nawet jeśli nie są one elementami obiektu. (Podziękowania dla Oli za zwrócenie na to uwagi!)
.
i->
może być również używany do statyki klasy dostęp za pośrednictwem obiektu, mimo że nie są one ściśle „członków obiektu”.operator*()
może być również przeciążone i że nic nie zmusza do tego przeciążeniaoperator->()
! (Nie głosowałem za BTW, po prostu dotarłem tutaj przez długą sekwencję duplikatów)->
przez przeciążenieoperator*
i użycie.
.operator->
Dostają to tylko przeciążenia.Sugerowanie alternatywy dla punktu 3 Sbi
a->b
jest używany tylko wtedy, gdya
jest wskaźnikiem. Jest to skrót od(*a).b
Theb
członkiem obiekt, którya
wskazuje. C ++ ma dwa rodzaje wskaźników, „zwykłe” i inteligentne. W przypadku zwykłych wskaźników, takich jakA* a
kompilator, implementuje->
. Dla inteligentnych wskaźników, takich jakstd::shared_ptr<A> a
,->
jest funkcją klasyshared_ptr
.Uzasadnienie: grupa docelowa tego FAQ nie pisze inteligentnych wskazówek. Nie muszą wiedzieć,
->
że naprawdę jest wywoływanyoperator->()
lub że jest to jedyna metoda dostępu do elementu, która może zostać przeciążona.źródło
+1
tylko za alternatywną odpowiedź.->
jest również przeciążona dla standardowych iteratorów, które każdy programista C ++ powinien wkrótce spotkać, więc powiedzenie, że jest używane tylko do wskaźników, może być mylące.Z powyższego przykładu kodowania widzimy, że:
* Uzyskiwanie dostępu do elementów (atrybutów i funkcji) z instancji (lub obiektu) za pomocą operatora kropki (
.
)* Uzyskiwanie dostępu do elementów (atrybutów i funkcji) ze wskaźnika do obiektu (lub utworzonego przez
new
) za pomocą operatora wskaźnika (->
)* Dostęp do statycznych funkcji składowych z samej klasy bez posiadania obiektu jako uchwytu za pomocą podwójnego dwukropka (
::
). [ Uwaga: można również wywoływać funkcję członka statycznego z instancji z.
lub->
która nie jest zalecana]źródło
->
może być używany tylko przez wskaźnik przydzielony przez stertęnew
? Poniżej drugi punkt, myślę, że naprawdę wyjaśniam, że->
chodzi o wskaźnik. A zanim przegłosujesz, lepiej spróbuj samclassName::non_static_member_function()
z c ++ 14. Odwołanie nie jest wskaźnikiem, więc można go używać.
, a ja wyjaśnię to w mojej odpowiedzi.Operator kropki jest używany w scenariuszach bezpośredniego wyboru członka.
Tutaj uzyskujemy dostęp
b
, który jest bezpośrednim członkiem obiektua
. Przede wszystkima
jest więc przedmiotem ib
jest członkiem (funkcją / zmienną itp.)a
.Operator strzałek jest używany w scenariuszach pośredniego wyboru członka.
Tutaj uzyskujemy dostęp
b
do elementu obiektu, na który wskazujea
. Jest to skrót(*a).b
i dlatego tutaja
jest przede wszystkim wskaźnikiem do obiektu ib
jest członkiem tego obiektu.Operator podwójnego dwukropka (zakres) jest używany w scenariuszach bezpośredniego wyboru elementu związanych z przestrzenią nazw.
Tutaj uzyskujemy dostęp,
b
który jest członkiem klasy / przestrzeni nazwa
. Więc przede wszystkima
jest klasą / przestrzenią nazw ib
jest członkiem (funkcja / zmienna itp.)a
.źródło