Бьерн Страуструп.
Язык программирования С++
196
p->update();
}
}
На самом деле, тип RecPtr должен определяться как шаблон типа (см. $$8), а тип структуры Record
будет его параметром. Кроме того, настоящая программа будет содержать обработку ошибок и
взаимодействие с диском будет организовано не столь примитивно.
Для обычных указателей операция -> эквивалентна операциям, использующим * и []. Так, если описано
Y* p;
то выполняется соотношение
p->m == (*p).m == p[0].m
Как всегда, для определенных пользователем операций такие соотношения не гарантируются. Там, где
все-таки такая эквивалентность требуется, ее можно обеспечить:
class X {
Y*
p;
public:
Y* operator->() { return p; }
Y& operator*() { return *p; }
Y& operator[](int i) { return p[i]; }
};
Если в
вашем классе определено более одной подобной операции, разумно будет обеспечить
эквивалентность, точно так же, как разумно предусмотреть для простой переменной x некоторого
класса, в котором есть операции ++, += = и +, чтобы операции ++x и x+=1 были эквивалентны x=x+1.
Перегрузка -> как и перегрузка [] может играть важную роль для целого класса настоящих программ, а
не является просто экспериментом ради любопытства. Дело в том, что в
программировании понятие
косвенности является ключевым, а перегрузка -> дает ясный, прямой эффективный способ
представления этого
понятия в программе. Есть другая точка зрения на операцию ->, как на средство
задать в С++ ограниченный, но полезный вариант
понятия делегирования (см. $$12.2.8 и 13.9).
Достарыңызбен бөлісу: