260______________________________Часть II. Программирование на C++

19: "Адрес статической функции-члена: " « a.ObjectAddress « endl;

20: cout « "Адрес объекта " « b.name « " : " « &Ь « endl « 21: "Адрес статической функции-члена: " « b.ObjectAddress « endl;

22: }

Совет

У классов и структур C++ много общего. Хотя классы являются более предпочтительным средством, структуры в C++ также поддерживаются, и, более того, могут иметь функции-члены, конструкторы и деструкторы. Чтобы узнать все о различиях между классами и структурами, прочтите главу 14 "Базовые концепции классов".

Строка 6 содержит объявление статической функции-члена (функция-член — это элемент группы: структуры или класса). Выводимые на экран значения со всей очевидностью демонстрируют, что адреса двух объектов различны, но адреса их статических элементов совпадают. Таким образом, в контексте структур и классов ключевое слово static используется для указания того, что соответствующая функция может существовать в одном и только в одном физическом экземпляре — одном на все объекты этого типа.

Совет

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

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

Замечание

C++, в отличие от других языков, требует определенной дисциплины. Возьмем для примера функцию Swap. Она может быть встраиваемой функцией. Кроме того, Swap можно сделать функцией-шаблоном (см. главу 19 "Классы-шаблоны"). Помимо этого, Swap может быть глобальной функцией или функцией-членом.

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

Спецификатор extern

Ключевое слово extern в применении к функции означает, что эта функция определена в каком-то другом месте. Это "другое место" может находиться в том же модуле, но ниже, или в другом модуле. Использование extern в традиционной манере