Эффективный совет C ++ 23 Предпочитайте функции, не являющиеся членами, а не дружественные функции функциям-членам

Озадачивая некоторые факты о дизайне классов, в частности, должны ли функции быть членами или нет, я изучил Эффективный С ++ и нашел Правило 23, а именно: Предпочитайте функции, не являющиеся членами, не дружественными функциями. Прочитать это из первых рук с помощью примера веб-браузера имело некоторый смысл, однако вспомогательные функции (названные функциями, не являющимися членами, как это в книге) в этом примере изменяют состояние класса, не так ли?

  • Итак, первый вопрос, разве они не должны быть членами?

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

Если у вас есть доступ к книге, не могли бы вы пояснить мне эти моменты подробнее?

35
задан Ted Percival 1 March 2019 в 00:11
поделиться