Я видел функции-члены, запрограммированные как внутри класса, к которому они принадлежат, так и вне класса с прототипом функции внутри класса. Я только запрограммировал использование первого метода, но задавался вопросом, лучше ли использовать другие или только личные предпочтения?Что лучше при программировании функции-члена?
ответ
Предполагая, что вы имеете в виду C++, всегда лучше определить функции вне класса, потому что, если вы поместите его внутри класса, компилятор может попытаться встроить его, что не всегда желательно:
- Увеличение размера кода (каждый объектный файл, который включает этот заголовок, может закончиться копией функции в их коде).
- Нарушение двоичной совместимости при изменении определения функции.
Даже встроенные функции, это обычно лучше поставить определения вне класса, чтобы улучшить читаемость открытого интерфейса класса, если функция не является тривиальной сбруей или каким-либо другой один вкладышем.
Независимо от того, реализована ли функция-член внутри класса, не имеет значения, попытается ли компилятор встроить ее в нее. – 2008-10-03 03:05:31
Есть преимущества для обеих техник.
Если вы разместите только прототипы в определении класса, это облегчит тем, кто использует ваш класс, чтобы узнать, какие методы доступны. Они не отвлекаются на детали реализации.
Ввод кода непосредственно в определение класса упрощает использование класса, вы должны только # включать заголовок. Это особенно полезно (необходимо) для шаблонных классов.
Предположив язык является C++:
Суть заключается в том, что личные предпочтения. Внутри класса более короткие и более прямые, особенно для
int getFoo() const { return _foo; }
тип функции. Внешний класс te может удалить «помехи» из определения класса.
Я видел, как в использовании ...
Конечно, не встраиваются функции всегда вне класса.
Я предполагаю, что вы говорите о C++.
Хороший и чистый интерфейс - это, безусловно, хорошая идея. Наличие отдельного файла реализации помогает сохранить ваш интерфейс в чистоте.
Он также сокращает время компиляции, особенно если вы используете opaque pointer.
Это также распространено для смешивания обоих стилей при определении класса. Для простых методов, состоящих из 1 или 2 строк, обычно и удобно определять тело метода в определении класса. Для более длинных методов лучше определить их извне. У вас будут более читаемые определения классов, не загромождая их телом метода.
Скрытие реализации метода выгодно тем, что пользователь класса не будет отвлекаться на фактическую реализацию или сделать предположения об осуществлении, которые могут измениться позднее.
Если вы реализуете функцию внутри класса, вы не можете # включать класс в несколько файлов .cpp или компоновщик будет жаловаться на несколько определений функции.
Таким образом, обычной практикой является определение класса в файле .h и реализация элементов в файле .cpp (обычно с тем же именем).
Для C++ определение меток определения в файле заголовка означает, что все, что содержит данный заголовок, необходимо перекомпилировать при изменении заголовка, даже если это всего лишь деталь реализации.
Перемещение определений из заголовка означает, что файлы, содержащие заголовок, должны быть перекомпилированы только тогда, когда сам заголовок изменяется (функции добавлены/удалены или объявления изменены). Это может иметь большое влияние на время компиляции сложных проектов.
Опять же, ассимилируя C++, я обычно ограничиваю это местами на виртуальных функциях, например.
virtual int MyFunc() {} // Does nothing in base class, override if needed
Что-то еще, и точка Эндрю Медико слишком легко и быстро врезается в компиляцию.
Вы не сказали, но это C++? – 2008-10-03 02:48:30
На каком языке? C++? – 2008-10-03 02:48:42