Озадачивая некоторые факты о дизайне классов, в частности, должны ли функции быть членами или нет, я изучил Эффективный С ++ и нашел Правило 23, а именно: Предпочитайте функции, не являющиеся членами, не дружественными функциями. Прочитать это из первых рук с помощью примера веб-браузера имело некоторый смысл, однако вспомогательные функции (названные функциями, не являющимися членами, как это в книге) в этом примере изменяют состояние класса, не так ли?
Итак, первый вопрос, разве они не должны быть членами?
Чтение немного дальше, он рассматривает функции STL, и действительно, некоторые функции, которые не реализуются некоторыми классами, реализованы в stl. Следуя идеям книги, они развиваются в некоторые удобные функции, которые упакованы в разумные пространства имен, такие как std :: sort
, std :: copy
из алгоритма
. Например, класс вектор
не имеет функции сортировки
, и используется функция сортировки stl
, так что она не является членом класса векторов. Но можно также распространить те же рассуждения на некоторые другие функции в классе векторов, такие как assign
, так что это также не может быть реализовано как член, а как вспомогательная функция. Однако это также меняет внутреннее состояние объекта, например sort, с которым он работал. Так в чем же причина этой тонкой, но важной (я полагаю) проблемы.
Если у вас есть доступ к книге, не могли бы вы пояснить мне эти моменты подробнее?