С++ для начинающих. Определение методов класса вне класса

При программировании классов функции, описываемые для класса, можно описывать непосредственно внутри класса или выносить за пределы класса, оставляя внутри класса только прототипы. Когда функции получаются большими, т. е. содержат много текстового кода, и функций в классе собрано немало, сильно страдает читаемость кода. Чтобы видеть скелет класса, т. е. понимать саму идею класса: ради чего он существует, что можно делать порождаемым от него объектом и т. д. — очень удобно выносить функции, принадлежащие классу, за класс.
  • Чтобы вынести функции класса за пределы класса, нужно использовать операцию разрешения контекса, в народе — двойное двоеточие: ::.
  • Для выноса функций из класса, но оставления принадлежности функций к классу, внутри класса оставляются прототипы выносимых за пределы класса функций, а вне класса функциям уточняют принадлежность объекта к классу с помощью операции разрешения контекста.
Чтобы понять отмеченное, нужно посмотреть код:

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

  • Операция разрешения контекста идентифицирует класс, к которому метод относится. Говорят, что идентификатор show_a() имеет область видимости класса.
  • Название функции с применением к ней уточняющего класс двойного двоеточия называется уточнённым именем функции.
  • Если функции класса не выносить за пределы класса, то тогда использовать уточнение имени необязательно.
Между функциями, описанными в классе, и функциями, вынесенными за класс, имеются различия. Совсем новичку трудно объяснить их очень просто, поэтому если вы пока ещё не продвинутые новички, то просто знайте, что различия есть. Особенно резко они проявляются при написании многофайлофых проектов. Если вы продвинутый новичок, то можете почитать, что это за различия такие, они описываются ниже.
  • Функции, определённые внутри класса, всегда inline, поэтому им не обязательно явно прописывать inline. Для выносимых за пределы класса функций в случае необходимости inline писать обязательно:


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

    (Некоторые системы разработки снабжены интеллектуальными компоновщиками, которые разрешают размещать встроенные определения в отдельном файле реализации)
  • Функции класса, которые делаются inline, должны описываться в той же единице трансляции, в которой объявлен класс.
Если говорить проще, то при написании многофайлового проекта может иметь значение является ли функция класса inline или не является. Здесь как раз может повлиять тот факт, что определённые внутри класса функции по умолчанию inline, а выносимые за пределы класса функции по умолчанию не inline.
inline — это рекомендация компилятору переписать функцию в такой вид, где в коде как бы функции не будет, т. е. разложить в тот вид, каким новички пытаются написать программы, когда понятия не имеют о функциях: запихать всё в main. Но тут не в main, а во все места обращения накопировать такую штуковину. Вообще, инлайнить функции при написании многофайловых проектов надо с большой осторожностью. Обычно пишут, что инлайн может ускорить работу программы, но то, что ускорит — совсем не факт, а вот время компиляции замедлить может здорово. В худшем случае из-за inline замедлится и время компиляции программы (при внесении изменений и перекомпилировании из-за этого) и скорость работы программы.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

8 комментариев: С++ для начинающих. Определение методов класса вне класса

  • Некто говорит:

    может это такой синтаксис в другой среде.
    Но в Visual Studio это работает не так.
    Мы типо выводим то, что выводится. Корректно будет так

    ведь метод show_a() и так выводит данные.
    Если нам нужно использовать cout, в Main(), то тогда следует изменить void на int для метода show_a().
    //void вообще означает, что эта функция не возвращает значений.
    и изменить метод на

    вот тогда использовать

    корректно.

    Автор сайта отвечает:
    спасибо за поправку




    1



    0
  • Мария говорит:

    Спасибо!




    0



    0
  • Даниил говорит:

    Перестал читать, после того, как увидел транслит




    0



    1
  • Аноним говорит:

    [/php]cout<<suka<<endl;[/php]




    0



    0
  • Игорь говорит:

    А как таким же образом объявить методы для шаблонного класса?




    0



    0
    • admin говорит:

      Пример для ввода числа и строки.

      У меня была попытка это объяснить Шаблоны классов. Первое знакомство




      0



      0
  • Валерий говорит:

    Здравствуйте. Не могу понять вообще в объектном программировании вот что, может вы объясните. В самом объекте есть данные члены, а коды методов в нём есть?

     




    0



    0
    • admin говорит:

      C++ не чисто объектно-ориентированный язык.
      Данные члены — это переменные и константы внутри объекта: атрибуты, свойства, значения и т. п.
      Коды методов — это поведение и расчёты.

      Коды методов — это коды, определяющие поведение объекту.

      Функции-члены классов часто называют методами классов.

      Вам это нужно было?




      0



      0

Добавить комментарий

Ваш e-mail не будет опубликован.

78 − 71 =

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/brayan-p-hogan/html5-i-css3-veb-razrabotka-po-standartam-novogo-pokoleniya-11643814/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Приходит программер в магазин. Подходит к витрине, хочет достать еды, но не может и говорит: - Rеаd оnlу, однако...

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок