Это потому, что вы не можете перегрузить операторы для типа указателя; Вы можете перегрузить только оператор, в котором хотя бы один из параметров (операндов) имеет тип класса или тип перечисления.
Таким образом, если у вас есть указатель на объект некоторого типа класса, который перегружает оператор индекса, вы должны разыменовать этот указатель, чтобы вызвать его перегруженный оператор индекса.
В вашем примере a
имеет тип MyClass*
; это тип указателя, поэтому используется встроенный operator[]
для указателей. Когда вы разыменовываете указатель и получаете MyClass
, у вас есть объект типа класса, поэтому используется перегруженный operator[]
.