Правила программирования на С и С++. Главы 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) ведет себя точно как указатель в С, то правило "без сюрпризов" не нарушается.