Найти тему

Разыменование указателей на объекты в С++

С указателями всегда всё непросто, особенно в С++. И особенно, если мы имеем дело с классами/объектами. Допустим, у нас есть такой класс:

class TCoord
{
public:
int X = 0;
int Y = 0;
};

А в программе мы захотели сделать что-то типа этого:

TCoord Coord; //Объект Coord
TCoord* PCoord = &Coord; //Указатель на Coord
*PCoord.X = 5; //!!! Это не компилируется

Здесь мы пытаемся записать число 5 в свойство Х через указатель PCoord. Но у нас это не получится - компилятор выдаст ошибку. Хотя всё это прекрасно работает с обычными переменными (пример см. здесь). Но почему с объектом это не прокатывает?

А всё дело в том, что оператор . выполняется раньше, чем оператор *, поскольку имеет более высокий приоритет. То есть мы пытаемся записать значение в свойство объекта раньше, чем разыменовываем указатель. Это и приводит к ошибке.

И хотя сообщение об ошибке в этом случае довольно внятное:

[Error] request for member 'X' in 'PCoord', which is of pointer type 'TCoord*' (maybe you meant to use '->' ?)

не каждый новичок додумается, что с этим делать. В сообщении нам советуют использовать ->, и это правильное решение. Но если вам очень хочется оставить * для разыменования указателя, то и это возможно. Только придётся использовать скобки для повышения приоритета оператора, как это делается во всех остальных случаях:

(*PCoord).X = 5;

и вот это уже будет работать.

Ну и для лучшего понимания рисунок с исходным кодом:

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.

Наука
7 млн интересуются