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