Я понимаю нормальную перегрузку оператора. Компилятор может напрямую перевести их на вызов метода. Я не очень разбираюсь в операторе → . Я писал свой первый пользовательский итератор, и я чувствовал потребность в операторе → . Я взглянул на исходный код stl и внедрил свой собственный:
MyClass* MyClassIterator::operator->() const
{
//m_iterator is a map<int, MyClass>::iterator in my code.
return &(m_iterator->second);
}
Затем я могу использовать экземпляр MyClassIterator, например:
myClassIterator->APublicMethodInMyClass().
Похоже, компилятор делает два шага здесь. 1. Вызовите метод → (), чтобы получить временную переменную MyClass *. 2. Вызовите APublicMethodInMyClass для переменной temp с помощью оператора → .
Правильно ли я понимаю?