когда я использую точку, стрелку или двойное двоеточие для ссылки на члены класса в c ++?

<p>исходя из других производных от c языков (таких как java или c #) и c++, поначалу очень сбивает с толку тот факт, что в c++ есть три способа обращения к членам класса: <code>a::b</code>, <code>a.b</code> и <code>a->b</code>. когда я использую какой из этих операторов?</p><p><sub><em> (примечание. предполагается, что это будет вход в <a href="https://stackoverflow.com/questions/tagged/c++-faq">faq по c++ в stack overflow</a> . если вы хотите критиковать идею предоставления faq в эта форма, а затем <a href="https://meta.stackexchange.com/questions/68647/setting-up-a-faq-for-the-c-tag">публикация в meta, с которой все это началось</a> будет местом для этого. ответы на этот вопрос отслеживаются в <a href="http://chat.stackoverflow.com/rooms/10/c-lounge">c++ chatroom</a> , где faq идея возникла в первую очередь, поэтому ваш ответ, скорее всего, прочитают те, кто придумал эту идею.) </em></sub></p>

<p>три различных оператора, которые использует c++ для доступа к членам класса или объекта класса, а именно: двойное двоеточие <code>::</code>, точка <code>.</code> и стрелка <code>-></code>, используются для трех различных сценариев, которые всегда четко определены. знание этого позволяет сразу же узнать довольно много о <code>a</code> и <code>b</code>, просто взглянув на <code>a::b</code>, <code>a.b</code> или <code>a->b</code> соответственно, в любом коде, на который вы смотрите.</p><ol> <li> <p><code>a::b</code> используется только в том случае, если <code>b</code> является членом класса (или пространства имен) <code>a</code>. то есть в этом случае <code>a</code> всегда будет именем класса (или пространства имен).</p> </li> <li> <p><code>a.b</code> используется только в том случае, если <code>b</code> является членом объекта (или ссылкой на объект) <code>a</code>. таким образом, для <code>a.b</code>, <code>a</code> всегда будет фактическим объектом (или ссылкой на объект) класса.</p> </li> <li> <p><code>a->b</code> изначально является сокращенной записью для <code>(*a).b</code>. однако <code>-></code> - это единственный из операторов доступа к элементам, который может быть перегружен, поэтому, если <code>a</code> является объектом класса, который перегружает <code>operator-></code> (распространенными такими типами являются интеллектуальные указатели и итераторы), то смысл заключается в том, что реализовал разработчик класса. в заключение: с <code>a->b</code>, если <code>a</code> является указателем, <code>b</code> будет членом объекта, на который ссылается <code>a</code>. однако, если <code>a</code> является объектом класса, который перегружает этот оператор, то вызывается перегруженная операторная функция <code>operator->()</code>.</p> </li> </ol><hr><p>мелкий шрифт:</p><ul> <li><sup><em>в c++ типы, объявленные как <code>class</code>, <code>struct</code> или <code>union</code>, рассматриваются как "типа класса". таким образом, приведенное выше относится ко всем трем из них.</em></sup></li> <li><sup><em>семантически ссылки - это псевдонимы для объектов, поэтому мне следовало бы добавить "или ссылку на указатель" также на # 3. однако я подумал, что это будет более запутанным, чем полезным, поскольку ссылки на указатели (<code>t*&</code>) ) редко используются.</em></sup></li> <li><sup><em>операторы точка и стрелка могут использоваться для ссылки на статические члены класса из объекта, даже если они не являются членами объекта. (спасибо оли за указание на это!)</em></sup></li> </ul>

<p><sub>предлагая альтернативу для пункта 3 sbi</sub></p><p><code>a->b</code> используется только если <code>a</code> является указателем. это сокращение для <code>(*a).b</code>, члена <code>b</code> объекта, на который указывает <code>a</code>. c++ имеет два вида указателей: "обычные" и "умные" указатели. для обычных указателей, таких как <code>a* a</code>, компилятор реализует <code>-></code>. для интеллектуальных указателей, таких как <code>std::shared\_ptr<a> a</code>, <code>-></code> является функцией-членом класса <code>shared\_ptr</code>.</p><p><i>обоснование: целевая аудитория этого faq не пишет умных указателей. им не нужно знать, что <code>-></code> действительно называется <code>operator->()</code> или что это единственный метод доступа к элементу, который может быть перегружен.</i></p>