Как сделать методы в классе

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон - этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие - другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.

В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.

По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :

После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:

Однако такой класс не особо показателен, поэтому добавим в него некоторую функциональность.

Поля и методы класса

Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса - это переменные, определенные на уровне класса.

Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.

Итак, добавим в класс Person поля и методы:

В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .

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

Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .

Создание объекта класса

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

Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .

Конструктор по умолчанию

Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.

Теперь создадим объект класса Person:

Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.

Обращение к функциональности класса

Для обращения к функциональности класса - полям, методам (а также другим элементам класса) применяется точечная нотация точки - после объекта класса ставится точка, а затем элемент класса:

Например, обратимся к полям и методам объекта Person:

Консольный вывод данной программы:

Константы классы

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

Здесь в классе Person определена константа type , которая хранит название класса:

Название класса не зависит от объекта. Мы можем создать много объектов Person, но название класса от этого не должно измениться - оно относится ко всем объектам Person и не должно меняться. Поэтому название типа можно сохранить в виде константы.

Стоит отметить, что константе сразу при ее определении необходимо присвоить значение.

Подобно обычным полям мы можем обращаться к константам класса внутри этого класса. Например, в методе Print значение константы выводится на консоль.

Однако если мы хотим обратиться к константе вне ее класса, то для обращения необходимо использовались имя класса:

Таким образом, если необходимо хранить данные, которые относятся ко всему классу в целом

Добавление класса в Visual Studio

Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. И Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса.

Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )

В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса - пусть он будет назваться Person :

В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс:

В файле Person.cs определим следующий код:

Здесь определен класс Person с одним полем name и методом Print.

В файле Program.cs , который представляет основной файл программы используем класс Person:

Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.

Всем привет! Объекты очень важная вещь в программировании, которая может облегчить решения многих задач. Например нужно вести дневник пользователя: год рождения, имя, фамилия, местожительство, все это можно продолжать еще очень долго. Поэтому, как и другие языки программирования C++ обзавелся — классами.

Как создать класс

Чтобы объявить класс нужно использовать данную конструкцию:

Обычно прописывают с заглавной буквы. Также в конце обязательно должна присутствовать точка с запятой ( ; ).

Что такое класс

Это абстрактный тип данных. Он сочетает в себе два функционала:

  • Первая — это структура, в которой можно хранить различные типы данных: массивы, переменные, функции.
  • Вторая — возможность пользоваться объектно-ориентированным программированием (ООП — об этом ниже).

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

класс примеры c объектами

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

Так свойства класса Worker (рабочий) может иметь — имя, производительность (полезность работы) за 6 месяцев, среднюю производительность.

Методы — это обычные функции, в функционале которых можно использовать свойства.

Чтобы обратится к свойствам и методам класса нужно перед названием имени свойства поставить точку . .

Что такое ООП

Раньше программистам приходилось весь функционал программы записывать в одном файле. Что в будущем неизбежно приводило к путанице из-за нескольких сотен и даже тысяч строк. А с приходом классов появилась возможность отделять любую часть программы в отдельный файл.

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

В ООП входит такие свойства:

  • Инкапсуляция — это возможность задавать разную область видимости определенной части класса .
  • Наследование — это свойство создавать новый класс на базе старого. Такие классы называют потомками, например, есть класс магазин , на базе которого можно создать потомки продуктовый_магазин , магазин_одежды (не обращайте внимание, что название на русском языке).
  • Полиморфизм — возможность создать объекты с одинаковым интерфейсом, но с разной их реализацией. Например, есть три класса треугольник , круг и квадрат . У каждого из них есть метод SquarePlis() , который вычисляет площадь фигуры. Но для каждого класса функция реализована по-разному.

Создание собственных классов. Абстракция

В будущем тебе придется писать собственные классы. На что нужно обратить внимание при их написании? Если мы говорим о переменных, тебе нужно пользоваться такой вещью как абстракция . Абстракция — один из четырех основных принципов объектно-ориентированного программирования. Он подразумевает выделение главных, наиболее значимых характеристик предмета , и наоборот — отбрасывание второстепенных, незначительных. Например, мы создаем картотеку работников компании. Для создания объектов "работник" мы написали класс Employee . Какие характеристики важны для описания работника в картотеке компании? ФИО, дата рождения, номер социального страхования, ИНН. Но вряд ли в карточке работника компании нам нужны его рост, цвет глаз и волос. Компании эта информация ни к чему. Поэтому для класса Employee мы зададим переменные String name , int age , int socialInsuranceNumber и int taxNumber , а от лишней для нас информации (типа цвета глаз) откажемся, абстрагируемся . А вот если мы создаем картотеку фотомоделей для модельного агентства, ситуация резко меняется. Для описания фотомодели нам как раз очень важны рост, цвет глаз и цвет волос, а вот номер ИНН для нее нам абсолютно не важен. Поэтому в классе Model нам нужно создать переменные int height , String hair , String eyes . Вот так и работает абстракция, все просто! :)


Класс является одним из самых крупных и важных понятий и инструментов языка C++, именно он делает язык объектно-ориентированным и очень мощным. Мы очень часто пользуемся объектами и методами, ведь 99% библиотек являются просто классами! Объекты, методы, что это? Я могу привести несколько официальных определений (хотя вы сами можете их загуглить), но не буду, потому что они очень абстрактные и ещё сильнее вас запутают. Давайте рассмотрим всё на примере библиотеки, пусть это будет стандартная и всем знакомая библиотека Servo. Возьмём из неё пример Knob и разберёмся, где кто и как называется.

Итак, мы можем создать объект класса, и применять к нему методы. Какую первую мысль вызывает использование объекта? Правильно, “ой, как удобно“! Ведь мы можем создать несколько объектов Servo, и управлять каждым в отдельности при помощи одинаковых методов, но каждый объект будет обладать индивидуальным набором настроек, которые хранятся где-то внутри него. Это и есть объектно-ориентированный подход, позволяющий создавать очень сложные многоуровневые программы, не испытывая особых трудностей. Классы очень похожи на структуры, как по объявлению, так и по использованию, но класс является гораздо более мощной единицей языка: если в структуре мы под одним именем храним переменные разных типов, то в классе мы храним не только переменные, но и собственные функции класса. Функции внутри класса кстати и называются методами.

Внутри класса

Ну чтож, давайте заглянем во внутрь класса и посмотрим, как там всё устроено! Начнём с того, как объявляется класс: при помощи ключевого слова class

Очень похоже на структуру ( struct ), правда? Так и есть, и создаётся объект точно так же – по “ярлыку”:

Вы не поверите, обращение к методам и параметрам класса осуществляется точно так же, как в структурах: через оператор точка . :


Теперь давайте заглянем “под капот” класса Servo и сравним теорию с практикой: Что такое public и private ? Это спецификаторы доступа к членам класса. Открытые члены ( public ) — это члены структуры или класса, к которым можно получить доступ извне этой же структуры или класса (из скетча например). Закрытые члены ( private ) — это члены класса, доступ к которым имеют только другие члены этого же класса (только внутри класса). Есть ещё protected , но мы его рассматривать не будем, т.к. он вам вряд ли пригодится. Если освоите всё остальное – читайте про наследование классов, тема обширная и очень сложная. Собственно мы видим в “публичном доступе” все те методы, которыми можно пользоваться при работе с Servo. Это очень удобно, потому что не нужно гуглить искать документацию – всё написано в описании класса. Методы объявляются точно так же, как обыкновенные функции, мы подробно обсуждали это в предыдущем уроке. Закрытые члены в классе серво – переменные, из их названий можно понять, что они в себе хранят. Доступа к этим переменным “из скетча” мы не имеем, читать эти переменные могут только методы класса. Также на картинке выше вы могли увидеть слово конструктор – это ещё одна штука, которая может находиться в классе. Конструктор позволяет инициализировать закрытые параметры при создании объекта, и вообще по сути: конструктор – это функция, вызываемая в момент создания объекта. Давайте создадим свой класс, и на его примере разберём некоторые особенности.

Пишем класс

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

Мы создали класс под названием Color , в котором есть конструктор и переменные _color и _bright . Что важно знать:

  • Имя класса принято писать с большой буквы, чтобы отделить от переменных (которые, напомню, принято писать с маленькой)
  • Имя конструктора должно совпадать с именем его класса (регистр важен!)
  • Закрытые переменные принято называть, начиная с нижнего подчёркивания, _color у нас
  • Конструктора может не быть, тогда компилятор сам его создаст, название будет совпадать с названием класса

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

Мы сделали конструктор функцией, которая принимает параметр типа byte , и присваивает его в переменную класса _color . Мы написали реализацию функции внутри класса, это важно, потому что это можно сделать и снаружи. После вызова конструктора (создания объекта) переменная color удаляется из памяти (она была локальная), но её значение остаётся в нашей _color . Хорошо. Давайте позволим пользователю установить также яркость при создании объекта. Здесь нам поможет знание о перегруженных функциях из прошлого урока.

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

И создадим сразу объект, нам не жалко. А вот такую кучу конструкторов наплодили – жалко! И тут нам поможет такая штука, как инициализация внутри конструктора. Смотрите, как это работает:

Один конструктор, в котором через оператор = поставлена инициализация значения локальной переменной, если она не передаётся как параметр. То есть, вызвав конструктор при создании myColor3() мы не передали параметров, и конструктор взял параметры по умолчанию, 5 и 30, и приравнял их в цвет и яркость. Также обратите внимание, что при создании myColor3 мы не ставим круглые скобки, т.к. конструктор у нас универсальный! При создании myColor(10) мы передали только цвет, 10, а яркость автоматически установилась в 30. А как не указать цвет, но указать яркость? А вот уже никак =) Только создавать новый конструктор. Давайте добавим ещё два метода – для установки и чтения текущих значений. Тут всё просто – установка по аналогии с конструктором, а чтение – просто return :

Теперь при вызове например myColor2.getColor() мы получим значение 10, как и установили при инициализации. Если вызовем myColor2.setColor(50) , то присвоим закрытой переменной _color объекта myColor2 значение 50. При дальнейшем вызове myColor2.getColor() мы получим уже 50. И точно так же это работает с остальными объектами и методом set/get Bright, который мы написали. Можете поиграться и проверить, выводя данные в порт (об этом у меня как раз следующий урок). Что тут ещё хочется добавить: не всегда удобно писать реализацию метода внутри класса, получается очень громоздко и класс перестаёт быть документацией к самому себе. Вспомните библиотеку Servo – методы объявлены, но расписаны где-то в другом месте! Это сделано в файле .cpp, об этом поговорим в уроке о создании библиотек. Сейчас давайте распишем реализацию методов вне класса – описание методов оставим внутри класса, а реализацию распишем “ниже”, в итоге класс останется чистеньким и наглядным:

Оу, что за двойное двоеточие? Двойное двоеточие :: является оператором, который уточняет область видимости имени, к которому применяется. Написав void Color::setColor … мы сообщили компилятору, что именно эта функция (метод) setColor относится к классу Color , и является собственно реализацией описанного там метода. Это означает, что у вас может быть и другая функция с таким же названием, но не относящаяся к классу Color , это очень удобно. Например вот такое пополнение не приведёт к ошибке, потому что мы объяснили компилятору, что к чему относится: первая функция – к классу Color , вторая – ни к чему, просто функция в этом документе:

Статические члены класса

Очень интересную особенность имеют статические члены класса – переменные и объекты. Если сделать член класса статическим, то он будет существовать только в одном экземпляре для всех объектов класса.

  • Переменная – станет глобальной для всех созданных объектов! Также к этой переменной можно обращаться напрямую от имени класса, вообще без участия объектов. Статическая переменная класса должна быть объявлена отдельно от класса (то есть создана, как объект).
  • Функция (метод) – можно обращаться к нему напрямую от имени класса, вообще без участия объектов. Важно: статический метод может изменять только статические переменные, потому что он не привязывается к объекту, то есть не знает, с переменной какого из объектов взаимодействовать!

Пример, показывающий всё вышесказанное:

Деструктор

Наряду с конструктором класса существует также деструктор (от англ. destruct – разрушать), который выполняет противоположное действие: уничтожает объект, убирает его из динамической памяти. Как и конструктор, деструктор создаётся автоматически, если не указывать его явно. Деструктор также можно объявить самостоятельно, для выполнения каких-то действий при уничтожении класса, например для освобождения динамической памяти. Деструктор объявляется точно так же, как конструктор, т.е. имя совпадает с именем класса, возвращаемого типа данных нет. Единственное отличие – тильда ~ перед именем. Рассмотрим наш класс из этого урока, у него деструктор будет ~Color(); Рассмотрим пример, заодно вспомним про область видимости переменных. Если создать объект вне функций – он будет создан глобальным, и будет существовать на протяжении всего времени работы программы. Если создать его внутри функции или блока кода – он будет существовать только в пределах этого блока, то есть переменные класса будут занимать память на протяжении выполнения этого блока кода. Рассмотрим вот такой класс:

В нём есть пустой конструктор, печатающий hello метод и деструктор. Выполним вот такой код:

В выводе порта увидим Hello и всё, потому что объект глобальный и деструктор не вызвался в процессе работы, потому что объект не уничтожался. Внесём создание объекта в блок функции setup() и посмотрим, что будет

Итак, мы с вами поэтапно создали класс и изучили большую часть особенностей работы с классами. На этом завершается раздел программирования, и начинается раздел базовых уроков Ардуино. А к классам мы ещё вернёмся, когда будем писать свою собственную библиотеку!

Читайте также: