Правила программирования на Си и Си++

       

Используйте перегрузку операций


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

арифметических типов.

Тем не менее, также разумно использовать перегруженные операции и там, где аналогии с Си незаметны. Например, большинство классов будет перегружать присваивание. Перегрузка 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)

ведет себя точно как указатель в Си, то правило "без сюрпризов" не нарушается.



Содержание раздела