Правила программирования на С и С++. Главы 7-8 - Используйте перегрузку операций только для определения операций, имеющих аналог в С (без сюрпризов)
ОГЛАВЛЕНИЕ
146. Используйте перегрузку операций только для определения операций, имеющих аналог в С (без сюрпризов).
Перегрузка операций была реализована в языке прежде всего для того, чтобы вы могли интегрировать разработанный вами арифметический тип в существующую арифметическую систему языка С. Этот механизм никогда не предназначался в качестве средства расширения этой системы. Следовательно, перегрузку операций лучше применять, лишь используя классы для реализации арифметического типа.
Тем не менее, также разумно использовать перегруженные операции и там, где аналогии с С незаметны. Например, большинство классов будет перегружать присваивание. Перегрузка operator==() и operator!=() также разумна в большинстве классов.
Менее ясным (и более противоречивым) примером является класс "итератор". Итератор является средством просмотра каждого члена структуры данных, и он используется почти точно так же, как если бы он был указателем на массив. Например, вы можете в С итерировать массив, просматривая каждый элемент, следующим образом:
string array[ size ];string *p = array;
for( int i = size; --i >= 0 ; )
visit( *p++ ); // функции visit() передается строка.
Аналог в С++ может выглядеть вот так (keys является деревом, чьи узлы имеют строковые ключи; здесь могут быть любые другие структуры данных): tree?string> keys; // двоичное дерево с узлами, имеющими строковые ключиiterator p = keys;
// ...
for( int i = keys.size(); --i >= 0 ; )
visit( *p++ ); // функции visit() передается строка.
Другими словами, вы обращаетесь с деревом как с массивом, и можете итерировать его при помощи итератора, действующего как указатель на элемент. И так как iterator(p) ведет себя точно как указатель в С, то правило "без сюрпризов" не нарушается.