Почему методы С++ иногда определяются внутри классов?

Я часто запускаю большие, не-шаблонные классы на С++, где простые методы определяются непосредственно в классе класса в файле заголовка, а не отдельно в файле реализации. Например:

class Foo {
  int getBar() const { return bar; }
  ...
};

Зачем? Похоже, что есть недостатки. Реализация не так скрыта, как должна быть, код менее читабельен, и в компиляторе также будет повышенная нагрузка, если заголовочный файл класса включен во многих разных местах.

Я предполагаю, что люди намерены включить эти функции в другие модули, что может значительно повысить производительность. Тем не менее, я слышал, что новые компиляторы могут делать inline (и другие межпроцедурные оптимизации) во время соединения между модулями. Насколько широка поддержка такого рода оптимизации времени соединения, и действительно ли это делает ненужным эти определения? Существуют ли другие веские причины для этих определений?

Ответ 1

В стандарте С++ указано, что методы, определенные внутри определения класса, по умолчанию inline. Это приводит к очевидному повышению производительности для упрощенных функций, таких как геттеры и сеттеры. Оптимизация кросс-модуля Link-time сложнее, хотя некоторые компиляторы могут это сделать.

Ответ 2

Часто нет причин, кроме простоты, и экономит время. Он также сохраняет небольшой беспорядок в файле реализации, занимая при этом одинаковое количество строк в файле заголовка. И быть менее читаемым довольно сложно, если оно ограничено такими вещами, как геттеры и сеттеры.

Ответ 3

Вы ответили на свой вопрос, они действительно встроенные методы.

Причины их использования - производительность.