Классы на языке Си

Язык программирования С и С# принадлежит к категории полноценных объектно-ориентированных языков программирования. Это указывает на то, что программу, которая будет написана на этом языке программирования, можно будет представить в виде объектов, которые связаны между собой. При этом непосредственно для описания самых объектов применяются классы.

Особенности классов

Если рассматривать язык программирования С и С++, то в них прослеживается уникальная особенность, так как они предоставляют возможность определить собственные типы данных, которые будет целесообразно применять в процессе определения самых разнообразных задач. Для процесса создания собственных пользовательских типов могут применяться структуры и перечисления. Например, структура, посредством которой можно осуществить хранение даты, будет выглядеть следующим образом:

Классы на языке Си

Если же смотреть на структуры и перечисления, то они не принадлежат к категории объектно-ориентированного программирования, а представляют собой стандартный традиционный метод. В нем может происходить только процесс хранения данных. Создание и инициализация в С++11 может быть реализована следующим образом:

Классы на языке Си

В том случае, если на экран необходимо вывести дату и может быть не единожды, целесообразно отдельно написать следующий код программы:

Классы на языке Си

В результате ее выполнения на экран будет выведено:

Классы на языке Си

Если же рассматривать объектно-ориентированное программирование, то в нем типы данных могут содержать в собственном составе не только данные, но и разнообразные функции, посредством которых можно будет осуществить работу с этими данными. В языке С++ для того, чтобы осуществить определение типа таких данных, применяется основное слово class. В процессе применения этого ключевого слова происходит процесс определения нового пользовательского типа данных под названием класс.

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

Классы на языке Си

Среди единственных существенных отличий, которые здесь существуют, стоит выделить слово public, которое в классе считается ключевым. Если же рассматривать одинаковые моменты, то в процессе создания классов, точно так же, как и объявления структур, не происходит процесс выделения свободной памяти. Для того, чтобы осуществить процесс применения класса, стоит объявить переменную, которая принадлежит к этому типу класса:

Классы на языке Си

Переменная класса в языке программирования С++ именуется, как объект класса или же экземпляр класса. Процедура создания объекта класса приводит к тому, что происходит процесс выделения памяти для хранения конкретного объекта.

Методы классов

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

Пример класса Date, в котором применяется метод для вывода даты выглядит следующим образом:

Классы на языке Си

Если проводить сравнение с членами структуры, то точно так же и для членов (функций и переменных) классов доступ открывается посредством применения оператора выбора членов (.):

Классы на языке Си

В результате выполнения программы будет получено:

Классы на языке Си

Здесь стоит обратить внимание на то, что представленная программа очень сильно похожа на программу, расположенную выше, в которой применяется структура. Но и здесь все-таки можно заметить некоторые отличия. Если рассматривать версию DateStruct, то в ней необходимо было осуществить процесс передачи переменной структуры в функцию print(), которая выступала в качестве параметра.

В том случае, если бы этот процесс не был бы реализован, то функция print() просто бы не знала, какую из переменных необходимо вывести. Это привело бы к тому, что внутри функции пришлось бы прямо ссылаться на определенные члены структуры.

Если же рассматривать действие методов класса, то работают они немного по-другому. Здесь стоит обратить внимание на то, что все вызовы методов в обязательном порядке должны быть связаны с объектами, принадлежащими к конкретным классам. В том случае, когда происходит вызов today.print(), это говорит компилятору о том, что необходимо вызвать метод print(), который применяется по отношению к объекту today.

Здесь стоит еще раз разобраться с определением такого метода, как print():

Классы на языке Си

Рассматривая такие элементы, как m_day, m_month и m_year, у многих возникает вопрос о том, на что они ссылаются. Здесь стоит обратить внимание на то, что каждый из них ссылается на так называемый связанный объект today.

Поэтому, в том случае, когда происходит вызов today.print(), компилятор осуществляет следующую интерпретацию:

Классы на языке Си

В том случае, если бы происходит вызов метода tomorrow.print(), то в таком случае m_day осуществлял бы ссылку на tomorrow.m_day.

По сути, если рассматривать связанный объект, то его передача методу является неявной. Поэтому очень часто можно заметить, что его называют, как неявный объект. Здесь стоит также обратить внимание на один ключевой момент.

В том случае, если есть необходимость осуществлять работу с теми функциями, которые не принадлежат к категории членов класса, необходимо осуществлять процесс передачи данных в функцию явно. Это можно сделать посредством применения параметров. А в том случае, если работа происходит с методами класса, то для них можно применять неявные объекты.

Для переменных-членов специально применяется префикс m_. Это дает возможность различать параметры функции или же локальные переменные от переменных-членов, которые находятся внутри определенного класса. Полезно реализовывать этот процесс будет по следующим причинам:

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

Здесь стоит запомнить одно простое правило, которое используется опытными программистами: написание имен классов стоит осуществлять непосредственно только с заглавной буквы. Здесь также можно обратить внимание еще на один программный код, в котором происходит процесс использования класса:

Классы на языке Си

В процессе выполнения представленной программы будет получен следующий результат:

Классы на языке Си

Если осуществлять процесс сравнения с обыкновенными функциями, то порядок, по которому будет происходить процесс определения методов класса, совершенно не важен.

Особенности функционирования конструктора и деструктора классов С++

Здесь в первую очередь стоит обратить внимание на то, что перед тем, как происходит процедура создания переменных (элементов) класса, в самом определении класса нет возможности задать присвоение определенных значений. В результате этого со стороны компилятора постоянно будет возникать ошибка. Поэтому есть необходимость в том, чтобы побеспокоиться о процессе создания совершенно отдельного метода.

В его качестве будет выступать специальная set-функция, которая будет способствовать такому процессу, как инициализация конкретных элементов. Здесь стоит обратить внимание на то, что в том случае, когда нужно будет, например, создать 20 совершенно разных объектов, входящих в структуру класса, придется ровно 20 раз вызывать set-функцию.

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

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

Зачастую деструктор применяется в том случае, когда в процессе создания объекта класса в конструкторе было определенно небольшой участок памяти, который необходимо очистить. В основном это осуществляется тогда, когда определенная часть программы в последующем больше не будет применяться.

Здесь также очень важно запомнить следующие особенности:

  • процедуру объявления конструктора и деструктора необходимо реализовать непосредственно в разделе с наименованием public;
  • в том случае, если происходит процесс объявления конструктора, то не стоит указывать тип данных того значения, которое возвращается;
  • для возвращаемого значения у деструктора также нет конкретного типа данных;
  • деструктору категорически запрещено осуществлять процесс передачи каких-либо параметров;
  • имя конструктора и используемого класса должны быть идентичными между собой;
  • в том случае, если есть необходимость, то в одном классе может быть создано одновременно несколько конструкторов. При этом имена должны быть между собой одинаковыми. По тем параметрам, которые будут передаваться, компилятор будет их различать между собой. Это будет осуществляться точно также, как и при перегрузке функции. В том случае, если в конструктор не будет осуществлено процесс передачи данных, то он будет выступать в качестве конструктора по умолчанию;
  • что же касается объявления деструктора, то в классе он может быть в единичном экземпляре.

Для того, чтобы разобраться с тем, каким образом работает конструктор, можно рассмотреть следующий пример программного кода:

Классы на языке Си

В результате выполнения кода, находящегося выше, появиться следующее окно:

Классы на языке Си

Из полученного результата можно заметить, что работа компилятора является моментальной в тот момент, когда происходит процесс создания объектов классов. Поэтому необходимости в вызове конструктора нет никакого.

Стоит обратить внимание на то, что конструктору можно осуществлять процесс передачи параметров. Посредством их использования конструктор может получить совершенно любые значения, которые в последующем можно использовать для такого процесса, как инициализация объектов, входящих в структуру класса.

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

Классы на языке Си

В результате осуществления этой программы будет получен следующий результат:

Классы на языке Си

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

Перегруженный конструктор класса

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

В конкретном определяемом классе может применяться несколько конструкторов в зависимости от того, в каком количестве есть необходимость. Их имя должно быть полностью идентичным тому, которое используется у класса, но при этом отличительной для них должна быть сигнатура.

Например: один конструктор будет принимать несколько параметров, второй не будет принимать параметров вовсе, а третий будет принимать три параметра и так далее. В том момент, когда будет происходить такой процесс, как создание объектов, в качестве аргументов будут передаваться именно параметры. Это даст возможность компилятору определить факт того, какой из вариантов конструкторов стоит использовать на этапе создания конкретного объекта.

Здесь стоит рассмотреть следующий пример:

Классы на языке Си

Классы на языке Си

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

Здесь можно наблюдать один из наиболее часто встречаемых вариантов, по которым происходит перегрузка конструкторов. А именно конструктор, в котором есть параметры и наоборот они отсутствуют. Достаточно часто у программистов возникает необходимость одновременно использовать два вида конструкторов. На этапе каждого объявления переменных конкретного класса есть возможность в применении соответствующего способа для объявления.

В зависимости от того, сколько нужно раз, столько и можно перегружать конструктор. Но и здесь не стоит забывать о том, что должна учитываться какая-то золотая середина. Поэтому осуществлять перегрузку рекомендуется в тех случаях, где в этом есть обязательная необходимость. И здесь стоит также обратить внимание на то, что деструктор по сравнению с конструктором не может подлежать процессу перегрузки. Это связано с тем, что он не осуществляет процесс приема параметров.

Указатели на объекты в С++

Получение доступа к структуре в языке программирования С++ возможно посредством применения указателей на объекты. Среди всех понятий в языке С++ именно указатели на объекты принадлежат к категории базовых.

В том случае, если есть необходимость в получении доступа к членам объекта непосредственно через сам объект, то в этом случае стоит применить оператор «точка». Если же есть необходимость в использовании указателя непосредственно на сам объект, то здесь целесообразно применить оператор «стрелка». Процесс применения таких операторов является полностью идентичным, как и для объединений и структур.

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

Классы на языке Си

Здесь стоит обратить внимание на то, что получение адреса объекта осуществлено посредством применения оператора, отвечающего за взятие адреса. Естественно, для того чтобы ознакомиться с особенностями работы с классами, стоит изучить большое количество информации, которая для разных версия языка программирования С может немного изменяться.

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

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