Три различных оператора, которые использует C ++ для доступа к членам класса или объекта класса, а именно двойное двоеточие ::
, точка .
и стрелка ->
, используются для трех различных сценариев, которые всегда четко определены. Зная это позволяет сразу узнать довольно много о a
и b
просто, посмотрев на a::b
, a.b
или a->b
, соответственно, в любом коде , вы смотрите на.
a::b
используется только если b
является членом класса (или пространства имен) a
. То есть в этом случае a
всегда будет имя класса (или пространства имен).
a.b
используется только если b
является членом объекта (или ссылкой на объект) a
. Таким образом a.b
, a
всегда будет фактическим объектом (или ссылкой на объект) класса.
a->b
изначально это сокращенная запись для (*a).b
. Тем не менее, ->
это единственный из операторов доступа к элементу, который может быть перегружен, поэтому, если a
это объект класса, который перегружается operator->
(обычные такие типы - это умные указатели и итераторы), то значение имеет то, что реализовал разработчик класса. В заключение: с a->b
, если a
является указателем, b
будет членом объекта, на который a
ссылается указатель . Если, однако, a
является объектом класса, который перегружает этот оператор, то operator->()
вызывается перегруженная операторная функция .
Мелкий шрифт:
- В C ++, типы объявлены
class
, struct
или union
считаются «типа класса». Таким образом, вышесказанное относится ко всем трем.
- Семантически ссылки являются псевдонимами к объектам, поэтому мне следовало бы добавить «или ссылку на указатель» на # 3. Тем не менее, я подумал, что это будет более запутанным, чем полезным, поскольку ссылки на указатели (
T*&
) редко когда-либо используются.
- Операторы точка и стрелка могут использоваться для ссылки на статические члены класса из объекта, даже если они не являются членами объекта. (Спасибо Оли за то, что указал на это!)
.
и->
может также использоваться для доступа к статическим классам через объект, даже если они не являются строго «членами объекта».operator*()
также может быть перегружен, и что ничто не заставляет эту перегрузку соответствоватьoperator->()
! (Я не понизил BTW, просто попал сюда через длинную последовательность дубликатов)->
при перегрузкеoperator*
и использовании.
, однако. Этоoperator->
получают только перегрузки.Предлагая альтернативу для пункта 3 sbi
a->b
используется только еслиa
указатель. Это сокращенное(*a).b
, тоb
член объекта , которыйa
указывает. C ++ имеет два вида указателей, «обычные» и умные указатели. Для обычных указателей, таких какA* a
, реализует компилятор->
. Для умных указателей, таких какstd::shared_ptr<A> a
,->
является функцией-членом классаshared_ptr
.Обоснование: целевая аудитория этого FAQ не пишет умных указателей. Им не нужно знать
->
, действительно ли они вызваныoperator->()
или что это единственный метод доступа к элементу, который может быть перегружен.источник
+1
просто для альтернативного ответа.->
это также перегружено для стандартных итераторов, с которыми вскоре должен встретиться любой программист на C ++, так что утверждение, что оно используется только для указателей, может сбить с толку.Из приведенного выше примера кодирования мы видим, что:
* Доступ к членам (атрибутам и функциям) из экземпляра (или объекта) с помощью оператора точки (
.
)* Доступ к членам (атрибутам и функциям) из указателя на объект (или созданный
new
) использование оператора указателя (->
)* Доступ к статическим функциям-членам из самого класса без использования объекта в качестве дескриптора с использованием двойного двоеточия (
::
). [ Примечание: вы также можете вызвать статическую функцию-член из экземпляра с.
или,->
что не рекомендуется]источник
->
может быть использован только указатель, который выделен в кучеnew
? Ниже, второй пункт, я думаю, я действительно проясняю, что->
для указателя. И перед тем, как понизить голосование, вам лучше попробоватьclassName::non_static_member_function()
c ++ 14 самостоятельно. Ссылка не является указателем, поэтому ее можно использовать.
, и я поясню в своем ответе.Точечный оператор используется в сценариях прямого выбора членов.
Здесь мы получаем доступ
b
, который является прямым членом объектаa
. Таким образом, прежде всего,a
является объектом иb
является членом (функция / переменная и т. Д.)a
.Оператор стрелки используется в сценариях косвенного выбора элементов.
Здесь мы получаем доступ
b
к элементу объекта, на который указываетa
. Это сокращение(*a).b
и поэтому здесь,a
в первую очередь, указатель на объект иb
является членом этого объекта.Оператор двойного двоеточия (Scope) используется в сценариях прямого выбора элементов, связанных с пространством имен.
Здесь мы обращаемся к
b
члену класса / пространства имен. Такa
что, в первую очередь,a
это класс / пространство имен иb
является членом (функцией / переменной и т. Д.)a
.источник