Мы делаем функцию non-member другом класса, когда хотим, чтобы он получал доступ к этим частным членам класса. Это дает ему те же права доступа, что и статическая функция-член. Обе альтернативы предоставят вам функцию, которая не связана с каким-либо экземпляром этого класса.
Когда мы должны использовать функцию друга? Когда мы должны использовать статическую функцию? Если обе являются жизнеспособными вариантами решения проблемы, как мы оцениваем их пригодность? Есть ли тот, который должен быть предпочтительным по умолчанию?
Например, при реализации factory, который создает экземпляры класса foo
, который имеет только частный конструктор, должна ли эта функция factory быть статическим членом foo
(вы бы назвали foo::create()
) или если это будет функция друга (вы бы назвали create_foo()
)?