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