Я пытаюсь понять современные идиомы C ++ и лучшие практики, и я хотел бы спросить, было ли когда-либо, когда автор разрабатывал класс, нужно было сделать функцию функцией-членом вместо свободной функции в классе пространство имен, кроме того, когда вам нужна диспетчеризация во время выполнения в зависимости от типа класса.
Я подумал, может быть, это будет, когда вам нужен доступ к закрытым членам класса, но вы также можете сделать бесплатную функцию друга и получить тот же эффект, но с преимуществами бесплатных функций, поэтому я не уверен, что лучше в этом дело.
Оправдано ли когда-нибудь сделать не виртуальную функцию членом?
Это не только оправдано, это типичный сделать не виртуальные функции членами класса, если они оперируют данными в этом классе.
Все, что вы можете сделать с помощью не виртуальной функции-члена, вы также можете сделать с помощью функции без друзей. Разница в том, вызываете ли вы функцию как obj.foo()
или же foo(obj)
, В объектно-ориентированной программе первое предпочтительнее, а второе используется только в (необычных) случаях, когда это помогает сделать код более читабельным.
Это не то, что изменилось в «современном» C ++. Так было всегда.
Одним из основных принципов ООП является инкапсуляция. Вы берете некоторые данные, которые логически вместе, и делаете из них класс. Расширением той же логической группировки будут функции, манипулирующие этими данными. Такие функции должны быть сделаны функциями-членами. Наличие у них свободных функций, которые являются классом, противоречит принципу инкапсуляции.