Сомнительное объявление функции члена класса - PullRequest
3 голосов
/ 10 сентября 2011

Я читаю учебник по C ++ и натолкнулся на следующее предложение:

Единственное отличие между определением функции-члена класса полностью внутри его класса или включением только прототипа, а затем егоопределением является то, что в первом случае функция автоматически будет считаться встроенной функцией-членом компилятором, тогда как во втором случае она будет нормальной (не встроенной) функцией-членом класса, что фактически не предполагает различий в поведении.

Я знаю, что такое встроенная функция, я сомневаюсь, какой стиль выбрать.Должен ли я определить каждую функцию внутри своего класса или снаружи?Возможно, самые простые функции внутри, а другие снаружи?
Я боюсь, что определение каждой функции внутри класса (т. Е. Наличие сложных встроенных функций) может испортить полученный код и привести к проблемам отладки или странному поведению во время выполнения.И, наконец, проблема «стиля кодирования».Итак,
какой подход лучше?

Спасибо:)

Ответы [ 5 ]

1 голос
/ 10 сентября 2011

Мой стиль: я иногда помещаю чрезвычайно короткие (один или два линейных) функции в сам класс.Все, что мне по-прежнему нужно в качестве встроенной функции, идет как inline квалифицированные реализации после определения класса, и часто в отдельном файле, заголовок #include s в конце определения класса.

Логическое обоснование размещения встроенной функции вне класса заключается в том, что реализация некоторой функции обычно мешает общему пониманию этого класса читателем.Функция из двадцати строк обычно суммируется в однострочном комментарии - и этот комментарий - все, что нужно, когда вы читаете определение класса.Если вам нужно больше, перейдите к определению функции или, что еще лучше, прочтите документацию Fine.(Ожидание, что кто-то прочтет код F ***, является плохой заменой тонкой документации.)

0 голосов
/ 11 сентября 2011

Лучшее решение - разделить интерфейс и реализацию.Интерфейс - это ваш h-файл.Положите там только прототипы.Реализация идет в cpp-файл.Этот подход имеет следующие преимущества:

  1. Компиляция выполняется быстрее, поскольку нет необходимости компилировать тела функций несколько раз.
  2. Зависимость заголовка проще, поскольку нет необходимости включать все заголовкив h-файл.Некоторые заголовки нужны только в cpp-файле, и вы можете использовать предварительные объявления в h-файле.Также вы можете избежать циклических зависимостей.
  3. Последнее, но не менее важное - людям легче понять интерфейс вашего класса.Там нет кода беспорядок.
0 голосов
/ 10 сентября 2011

Вообще говоря, функция-член, которая имеет только одно или два оператора, вероятно, лучше всего, когда ее тело записано в объявлении класса, особенно если их много.Функция-член с более чем 20-50 операторами, вероятно, лучше не указывать в объявлении класса.Для длин и сложностей между ними это зависит от многих факторов.

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

0 голосов
/ 10 сентября 2011

Ни один из подходов сам по себе не является лучшим, это вопрос предпочтений и стиля. Лично я всегда думаю, что лучше явно определять функции в отдельном файле .inline. Таким образом, вы очень четко представляете, что делаете, и сохраняете файл заголовка чистым.

Кроме того, если вы используете макрос, такой как INLINE, который определяется следующим образом:

#ifdef DEBUG 
    #define INLINE
#else
    #define INLINE inline
#endif

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

0 голосов
/ 10 сентября 2011

Чтобы ответить на часть "Какой подход лучше?" - Из C ++ FAQ -

Нет простых ответов: вы должны поиграть с ним, чтобы увидеть, что лучше. Не соглашайтесь на упрощенные ответы, такие как «Никогда не используйте встроенные функции» или «Всегда используйте встроенные функции» или «Используйте встроенные функции, если и только если функция меньше N строк кода». Эти правила одного размера могут быть легко записаны, но они приведут к неоптимальным результатам.

...