Обычно есть либо указатель, либо ссылка на структуру/класс. Как мы уже знаем из предыдущих уроков, доступ к члену структуры осуществляется через оператор выбора члена (.
) (или «оператор доступа к члену»):
1 2 3 4 5 6 7 8 9 |
struct Man { int weight; double height; }; Man man; // Доступ к члену осуществляется через использование фактической переменной структуры Man man.weight = 60; |
Этот синтаксис также работает и со ссылками:
1 2 3 4 5 6 7 8 9 10 |
struct Man { int weight; double height; }; Man man; // определяем переменную структуры Man // Доступ к члену осуществляется через ссылку на переменную структуры Man Man &ref = man; ref.weight = 60; |
Однако, в случае с указателем, вам нужно его сначала разыменовать:
1 2 3 4 5 6 7 8 9 10 |
struct Man { int weight; double height; }; Man man; // Доступ к члену осуществляется через указатель на переменную структуры Man Man *ptr = &man; (*ptr).weight = 60; |
Обратите внимание, разыменование указателя должно находиться в круглых скобках, поскольку оператор выбора члена имеет более высокий приоритет, чем оператор разыменования.
Поскольку синтаксис доступа к членам структур/классов с помощью указателя несколько неудобен, то C++ предоставляет второй оператор выбора членов (->
) для осуществления доступа к членам через указатель. Следующие две строки идентичны:
1 2 |
(*ptr).weight = 60; ptr->weight = 60; |
Это не только легче писать, но и этот способ так же менее подвержен ошибкам, поскольку здесь разыменование выполняется неявно, поэтому нет проблем с приоритетом, о котором нужно помнить. Следовательно, при доступе к членам структур или классов через указатель, всегда используйте оператор ->
вместо оператора .
.
Правило: При использовании указателя для доступа к значению члена структуры или класса используйте оператор «->» вместо оператора «.».
тем, кто сомневается в удобстве синтаксиса -> можно предложить сравнить:
с
оставим за скобками идиотизм подобного вызова 🙂 Но в принципе то подобное возможно! Что читается проще и наглядней? :)))
Не видел структуры, но мне лично сложно такое читать.
С -> идет все ступенчато.
В Microsoft Visual Studio можно писать через точку, среда разработки сама исправит на нужный оператор.
И добавлю что у тебя указан неверный пример. Для указателя оператор разыменования или выбора члена нужно укзывать только один раз, остальной доступ осуществляется только через точку:
если каждый член указатель?
Ты не прав. Это зависит от того, является ли член указателем
…и пусть не будет тебе каждый член указателем!:-)