Os três operadores distintos que o C ++ usa para acessar os membros de uma classe ou objeto de classe, ou seja, dois pontos duplos ::
, o ponto .
e a seta ->
, são usados para três cenários diferentes, sempre bem definidos. Sabendo isto permite-lhe saber imediatamente bastante sobre a
e b
só de olhar a::b
, a.b
ou a->b
, respectivamente, em qualquer código que você olhar.
a::b
é usado apenas se b
for um membro da classe (ou espaço para nome) a
. Ou seja, nesse caso a
, sempre será o nome de uma classe (ou espaço para nome).
a.b
é usado apenas se b
for um membro do objeto (ou referência a um objeto) a
. Portanto a.b
, a
sempre será um objeto real (ou uma referência a um objeto) de uma classe.
a->b
é, originalmente, uma notação abreviada para (*a).b
. No entanto, ->
é o único operador de acesso de membro que pode ser sobrecarregado; portanto, se a
é um objeto de uma classe que sobrecarrega operator->
(tipos comuns são ponteiros e iteradores inteligentes), o significado é o que o designer de classe implementou. Para concluir: With a->b
, se a
for um ponteiro, b
será um membro do objeto ao qual o ponteiro a
se refere. Se, no entanto, a
for um objeto de uma classe que sobrecarrega esse operador, a função de operador sobrecarregado operator->()
é chamada.
As letras pequenas:
- Em C ++, tipos declarado como
class
, struct
ou union
são considerados "de tipo de classe". Portanto, o acima se refere a todos os três.
- As referências são, semanticamente, aliases aos objetos, então eu deveria ter adicionado "ou referência a um ponteiro" ao # 3 também. No entanto, achei que isso seria mais confuso do que útil, pois as referências a ponteiros (
T*&
) raramente são usadas.
- Os operadores de ponto e seta podem ser usados para se referir a membros de classe estáticos de um objeto, mesmo que não sejam membros do objeto. (Obrigado a Oli por apontar isso!)
.
e->
também pode ser usado para acessar estatísticas de classe por meio de um objeto, mesmo que não sejam estritamente "membros do objeto".operator*()
também pode ser sobrecarregado e que nada força essa sobrecarga a ser consistenteoperator->()
! (Eu não downvote BTW, acabou de chegar aqui através de uma longa sequência de duplicatas)->
sobrecarregandooperator*
e usando.
, no entanto. Apenasoperator->
sobrecargas conseguem isso.Sugerindo uma alternativa para o ponto 3 do sbi
a->b
é usado apenas sea
for um ponteiro. É uma abreviação de(*a).b
, ob
membro do objeto quea
aponta para. O C ++ possui dois tipos de ponteiros, "regular" e inteligente. Para ponteiros regulares, comoA* a
, o compilador implementa->
. Para ponteiros inteligentes, comostd::shared_ptr<A> a
,->
é uma função de membro da classeshared_ptr
.Justificativa: o público-alvo desta FAQ não está escrevendo indicadores inteligentes. Eles não precisam saber
->
se realmente é chamadooperator->()
ou que é o único método de acesso de membro que pode ser sobrecarregado.fonte
+1
apenas por fornecer uma resposta alternativa.->
também é sobrecarregado para iteradores padrão que qualquer programador C ++ deve encontrar em breve, portanto, dizer que é usado apenas para ponteiros pode ser confuso.No exemplo de codificação acima, vemos que:
* Acessando membros (atributos e funções) de uma instância (ou objeto) usando o operador dot (
.
)* Acessando membros (atributos e funções) de um ponteiro para um objeto (ou criado por
new
) using the pointer operator (->
)* Acessando funções de membro estáticas da própria classe sem ter um objeto como identificador usando dois pontos duplos (
::
). [ Nota: você também pode chamar a função de membro estático de uma instância com.
ou->
que não é recomendada]fonte
->
que só pode ser usado por um ponteiro alocado na pilha pornew
? Abaixo, o segundo item, acho que realmente deixo claro que->
é para apontar. E antes de votar, é melhor você tentarclassName::non_static_member_function()
com o c ++ 14 sozinho. A referência não é um ponteiro; portanto, ela pode ser usada.
, e vou deixar mais claro na minha resposta.O operador de ponto é usado em cenários de seleção direta de membros.
Aqui, estamos acessando
b
, que é um membro direto de um objetoa
. Então, principalmente,a
é um objeto eb
é um membro (função / variável etc) dea
.O operador de seta é usado em cenários de seleção indireta de membros.
Aqui, estamos acessando o
b
que é um membro do objeto, apontado pora
. É uma abreviação de(*a).b
e, portanto, aqui,a
é principalmente um ponteiro para um objeto eb
é um membro desse objeto.O operador Double Colon (Scope) é usado em cenários de seleção direta de membros relacionados ao espaço para nome.
Aqui, estamos acessando o
b
que é um membro da classe / espaço para nomea
. Então, principalmente,a
é uma classe / espaço para nome eb
é um membro (função / variável etc) dea
.fonte