Перейти к содержанию

Последнее обновление:2026-10-12

C++ оператор разыменования *

0.Введение

Обычно при работе с указателями мы используем *, например:

int a = 1;
int *ptr = a;
std::cout << *ptr << std::endl;

Но есть ли у него ещё какие-то применения?

Ответ — да: в C++ есть ещё три:

  • ::*
  • .*
  • ->*

Знаете ли вы, что означает каждое из них?

1.::*

::* называется Pointer to member declarator — указатель-декларатор на член.

Приведём пример:

Как в приведённом ниже примере получить адрес w_?

Если написать double * d = &w_; это будет неверно, потому что неизвестно, где находится w_; поэтому нужен указатель-декларатор на член — с его помощью можно выполнить привязку, а имея такой указатель, можно обращаться к членам. Теперь перейдём к следующим двум.

class Rectangle {
 public:
  double w_, h_;

  Rectangle(double w, double h) : w_(w), h_(h) {}
  double area() { return w_ * h_; }
};

int main() {
  Rectangle r{2.1, 3.2};
  double Rectangle::* w = &Rectangle::w_;
  r.*w = 2.2;
  std::cout << r.w_ << std::endl;
};

2..*

.* называется pointer to member of object — это легко понять: это указатель для доступа к членам объекта. Указатель на член позволяет ссылаться на нестатические члены объекта класса. Указатель на член нельзя использовать для статических членов класса, поскольку адрес статического члена не связан ни с каким конкретным объектом.

Поэтому в примере выше эта строка кода изменяет значение члена w на 2.2.

r.*w = 2.2;

3.->*

->* называется pointer to member of pointer — это понять ещё проще: он аналогичен ., только работает с адресом члена **объекта-указателя*.

Поэтому соответствующий пример принимает вид:

Rectangle r{2.1, 3.2}, *pr;
pr = &r;
std::cout << pr->*w << std::endl;

Более подробную информацию читайте на cppreference.com.

https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_members

Ну как, разобрались? На этом раздел окончен~

Похожие темы

Комментарии