Что лучше использовать при программировании функции-члена?

StackOverflow https://stackoverflow.com/questions/165474

  •  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
    

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top