2010-07-05 2 views
2

Я изучаю сегодня о статических функциях класса в C++, и я не могу понять, для чего они хороши? Есть ли у кого-нибудь хорошие примеры, где они могут быть успешно применены?Каковы наиболее распространенные применения статических функций класса в C++?

Спасибо, Бода Cydo.

ответ

5

Статические функции-члены класса являются просто обычными (нечленными) функциями. Вы знаете, какие обычные функции полезны, не так ли? Таким образом, статические функции-члены хороши для одних и тех же вещей по тем же причинам.

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

Последний фактически позволяет реализовать некоторые полезные идиомы программирования и шаблоны, используя статическую функцию-член. Сделайте поиск, например, для идиомы «статический конструктор».

+0

Но статическая функция не имеет доступа к частным и защищенным членам, не так ли? Он имеет доступ только к другим статическим данным в классе? Я прав? – bodacydo

+1

@bodacydo: Не совсем. Статическая функция может обращаться к частным и защищенным членам класса, когда/if дано указатель на экземпляр этого стекла. Какая статическая функция не имеет, это неявный параметр 'this', поэтому, если вам нужен экземпляр класса для доступа, вы сами должны явно передать его функции. – AnT

+0

Нет, ты не прав. Если у вас есть класс 'A' со статическим методом' s() 'и private member' p', экземпляр pass-in позволяет 's()' обращаться к 'p'. Или 's()' может создавать экземпляры 'A' и заполнять' p'. Такого рода вещи. –

0

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

0

Подумайте «глобально». Нестатическая функция, как вы учитесь, работает на одном объекте, тогда как статическая функция разделяется всеми объектами класса - так ... что общего у всех этих объектов?

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

0

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