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

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

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

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


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

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

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

  1. Некто:

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

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

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

    корректно.

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

  2. Мария:

    Спасибо!

  3. Даниил:

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

    2
    1
  4. Аноним:

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

  5. Игорь:

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

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

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

  6. Валерий:

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

     

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

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

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/roman-suzi/python/?lfrom=15589587
Яндекс.Метрика