В некотором смысле здесь, но я хотел бы попытаться создать точное определение: статические функции - это функции, которые не ссылаются или не могут ссылаться на свойства / методы экземпляра содержащего класса.
В некоторых языках, таких как C #, могут быть статические поля или свойства в статических классах, поэтому не совсем правильно говорить, что они не используются для состояния; статическая функция может использовать статическое (глобальное) состояние.
По сути, это сводится к следующему: статические функции, как и все статические, полезны, когда имеет смысл, чтобы они всегда были доступны без зависимости от нестатических экземпляров.
Вспомогательные функции, такие как математические функции, являются частым примером, но есть и другие.
Если класс, который вы создаете, требует, чтобы данные были неизменными, возможно, имеет смысл создавать статические функции, которые принимают экземпляр и передают новый экземпляр, поскольку экземпляр не может (или не должен) изменяться. Строковые классы, например, могут иметь статические функции, которые принимают строку (или 2 или более) и возвращают новую строку.
Другая причина может заключаться в том, что существует класс, который хранит глобальное состояние или данные какого-либо рода. Там могут быть статические функции, которые работают со статическими свойствами или полями в этом статическом классе.