Что лучше использовать при программировании функции-члена? - PullRequest
4 голосов
/ 03 октября 2008

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

Ответы [ 8 ]

6 голосов
/ 03 октября 2008

Предполагая, что вы имеете в виду C ++, всегда лучше определить функции вне класса, потому что, если вы поместите его в класс, компилятор может попытаться встроить его, что не всегда желательно:

  1. Увеличение размера кода (каждый объектный файл, содержащий этот заголовок, может в конечном итоге получить копию функции в своем коде).
  2. Нарушение двоичной совместимости при изменении определения функции.

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

4 голосов
/ 03 октября 2008

Для C ++ размещение определений методов в файле заголовка означает, что все, что включает данный заголовок, должно быть перекомпилировано при изменении заголовка - даже если это просто деталь реализации.

Удаление определений из заголовка означает, что файлы, которые включают заголовок, необходимо будет перекомпилировать только тогда, когда сам заголовок изменяется (функции добавлены / удалены, или объявления изменены). Это может оказать большое влияние на время компиляции для сложных проектов.

2 голосов
/ 03 октября 2008

При определении класса также принято смешивать оба стиля. Для простых методов, состоящих из 1 или 2 строк, обычно и удобно определять тело метода в определении класса. Для более длинных методов лучше определить их внешне. У вас будут более читаемые определения классов, не загромождая их телом метода.

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

2 голосов
/ 03 октября 2008

Предполагается, что язык C ++:

Суть в том, что это личное предпочтение. Внутри класс короче в целом и более прямой, особенно для

int getFoo() const { return _foo; }

тип функции. Вне класса te можно удалить «беспорядок» из определения класса.

Я видел оба в использовании ...

Конечно, не встроенные функции всегда находятся вне класса.

2 голосов
/ 03 октября 2008

У обоих методов есть свои преимущества.

Если вы поместите только прототипы в определение класса, это облегчит тому, кто использует ваш класс, чтобы увидеть, какие методы доступны. Они не отвлекаются на детали реализации.

Помещение кода непосредственно в определение класса упрощает использование класса, вам нужно только #include заголовок. Это особенно полезно (необходимо) для шаблонных классов.

1 голос
/ 03 октября 2008

Опять же, используя C ++, я обычно ограничиваю это заполнителями виртуальных функций, например,

virtual int MyFunc() {}  // Does nothing in base class, override if needed

Что-нибудь еще, и точка Эндрю Медико слишком легко срабатывает и вредит времени компиляции.

1 голос
/ 03 октября 2008

Если вы реализуете функцию внутри класса, вы не сможете #include класс в нескольких файлах .cpp, иначе компоновщик будет жаловаться на множественные определения функции.

Таким образом, обычной практикой является определение класса в файле .h и реализация членов в файле .cpp (обычно с тем же именем).

1 голос
/ 03 октября 2008

Полагаю, вы говорите о C ++.

Хороший и чистый интерфейс, безусловно, хорошая идея. Наличие отдельного файла реализации помогает поддерживать ваш интерфейс в чистоте.

Это также уменьшает время компиляции, особенно если вы используете непрозрачный указатель .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...