9.18 – Выбор члена структуры/класса при работе с указателями и ссылками

Добавлено 9 июня 2021 в 09:06
Глава 9 – Массивы, строки, указатели и ссылки  (содержание)

Указатели и ссылки обычно используются со структурами (или с классами). Как вы узнали ранее, вы можете выбрать член структуры с помощью оператора выбора члена (.):

struct Person
{
    int age{};
    double weight{};
};
 
Person person{};
 
// Выбор члена при использовании фактической переменной заданной структуры
person.age = 5;

Этот синтаксис также работает и для ссылок:

struct Person
{
    int age{};
    double weight{};
};
Person person{}; // определяем person
 
// Выбор члена при использовании ссылки на структуру
Person& ref{ person };
ref.age = 5;

Однако с указателем нужно использовать оператор стрелки:

struct Person
{
    int age{};
    double weight{};
};
Person person{};
 
//  Выбор члена при использовании указателя на структуру
Person* ptr{ &person };
ptr->age = 5;

Оператор стрелки делает то же самое, что и косвенное обращение, за которым следует . (оператор выбора члена в виде точки).

(*ptr).age = 5;
// то же, что и
ptr->age = 5;

Обратите внимание, что косвенное обращение через указатель должно быть заключено в круглые скобки, поскольку оператор выбора члена имеет более высокий приоритет, чем оператор косвенного обращения.

Оператор стрелки не только легче вводить, но он гораздо менее подвержен ошибкам, поскольку косвенное обращение выполняется неявно, и поэтому нет проблем с приоритетом, о которых следует беспокоиться. Следовательно, при доступе к члену через указатель всегда используйте оператор -> вместо оператора ..

Правило


При использовании указателя для доступа к значению члена используйте operator-> вместо operator. (оператора точки).

Оператор выбора члена всегда применяется к текущей выбранной переменной. Если у вас есть сочетание переменных-указателей и обычных переменных-членов, вы можете получить выбор членов, в котором . (точка) и -> (стрелка) перемешаны.

#include <iostream>
#include <string>
 
struct Paw
{
    int claws{};
};
 
struct Animal
{
    std::string name{};
    Paw paw{};
};
 
int main()
{
    Animal puma{ "Puma", { 5 } };
 
    Animal* pointy{ &puma };
 
    // pointy - это указатель, используем ->
    // paw - это не указатель, используем .
    std::cout << pointy->paw.claws << '\n';
 
    return 0;
}

Теги

C++ / CppLearnCppДля начинающихОбучениеОператор выбора членаПрограммированиеСсылка / Reference (программирование)СтруктураУказатель / Pointer (программирование)

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.