Совет

В математике есть несимметричные числовые системы; существуют удачные реализации связанных списков, которые используют + для обозначения функции добавления узла к списку.

Ничто не абсолютно. Однако если вы перегружаете операции, относительно которых уместны предположения о симметрии или транзитивности, то эти моменты не стоит упускать из вида.

Еще несколько замечаний. В предыдущем разделе было упомянуто, для чего operator+ и operator« должны быть друзьями. Поясним это еще раз.

Вот что мы имеем:

• Оператор-функции работают с данными, являющимися элементами классов.

• Только члены и друзья класса имеют доступ к его закрытым данным. Поэтому если операция должна иметь доступ к закрытым данным и она не является членом данного класса, то во всяком случае она должна быть его другом.

• Сложение — операция симметричная ( а + b = b + а). Следовательно, ее пользователи наверняка будут на это рассчитывать, и не следует зря нарушать правила.

В результате как правый, так и левый операнды должны передаваться как аргументы, следовательно, operator+ (в данном контексте) должна быть глобальной функцией, а не членом класса.

Замечание

1 Второе предположение относительно операций, закрытых данных и статусе друзей и членов не является абсолютно верным. В разделе "Операции преобразования " вы узнаете, почему.

В результате мы получаем, что operator+ должна быть дружественной, иначе она не сможет манипулировать с данными. Это не вполне объясняет, почему operator« тоже должна быть дружественной функцией, а не членом. Причины здесь несколько иные (объяснения этого наряду с подробным обсуждением библиотеки потоков ввода-вывода приведены в главе 13).

Пример 2. Этот пример чуть сложнее. Он демонстрирует подходы к решению специального класса проблем: выходу за границы массивов. Есть программы, которые помогают отлаживать ошибки такого рода, но подход, приведенный в данном разделе, позволяет при помощи классов решить проблему в корне.

Рассмотрим вопрос на примере целого массива:

int array[100] ;

array[100]=0; // индекс 100 выходит за границы массива