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

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

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

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

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

3 ответов


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


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


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

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