Важно то, что инициализация поля при его описании не допускается. — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Важно то, что инициализация поля при его описании не допускается.

2020-06-04 125
Важно то, что инициализация поля при его описании не допускается. 0.00 из 5.00 0 оценок
Заказать работу

В том случае если класс объявлен вне любого блока – он является глобальным, если же его объявление расположено внутри блока, то локальным.

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

В отношении методов существуют так называемые get-теры и set-теры, которые предназначены для получения и установки значения поля класса, соответственно.

Пример 2. Объявление класса. #include <iostream> using namespace std; class Example{ private: int day, month, year; // public: void msg(string str){ cout << str << endl; } void setDateOfBirth(int date_day, int date_month, int date_year){ if (date_day >= 1 and date_day <= 31) day = date_day; else cout << “day is not 1..31”; if (date_month >= 1 and date_month <= 12) month = date_month; else cout << “month is not 1..12”; year = date_year; } void getDateOfBirth(){ cout << “Date of birth” << day << “.” << month << “.” << year << endl; } }; int main(){ int day, month, year; Exampl exp; cout << “Enter date of Birth: ”; cin >> day; cout << endl << “Enter month of Birth: ”; cin >> month; cout << endl << “Enter year of Birth”; exp.setDateOfBirth(day, month, year); exp.getDateOfBirth(); system(“pause”); return 0; }

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

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

Классы. Пример.

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

Шаг 1. Определиться со свойствами.

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

Шаг 2. Определиться с методами.

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

Таким образом, мы определили поля и методы нашего класса, а теперь опишем сам класс (шаг 3):

Пример 3. Реализация класса для поставленной задачи. class Player{ private: string name; float maxHealth, currentLvlOfHealth; int impactForce; bool presenceOfWeapins; int numberOfPoints; public: void setName(){ cout << “Enter your name: ” cin >> name; } void setPresenceWeapons(bool pW){ presenceOfWeapins = pW; } void addPoints(int num){ numberOfPoints += num; } void addHealth(float num){ if (currentLvlOfHealth!= maxHealth) currentLvlOfHealth += num; } void subHealth(float num){ if (currentLvlOfHealth >=0) currentLvlOfHealth -= num; } float getHealth(){ return currentLvlOfHealth; } int getPoints(){ return numberOfPoints; } bool getPOW(){ return presenceOfWeapins; } string getName(){ return name; } void draw(int x, int y, int dx, int dy, int position); void setMaxHealth(float mH){ maxHealth = mH; } };

В полученном классе содержится 6 скрытых полей. Из них можно получить значения только четырёх с помощью методов getHealth(), getPoints(), getPOW() и getName(). Таким образом, все методы класса имеют непосредственный доступ ко всем его скрытым полям.

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

Пример 4. Формат определения метода класса за его пределами с помощью операции «::». void Player:: draw(int x, int y, int dx, int dy, int position){ /*Тело объявленного в функции метода*/ }
Пример 5. Формат определения метода класса за его пределами с помощью inline. inline void draw(int x, int y, int dx, int dy int position){ /*Тело объявленного в функции метода*/ }

Оптимизация примера

Класс, который был создан ранее может быть оптимизирован, а количество методов в нём может быть немного сокращено. Сделать это можно с помощью объединения методов subHealth (float num) и addHealth (float num). В обоих методах не осуществляется проверка на передачу в качестве параметра отрицательного числа. А ведь если передать такой параметр, то в первом случае количество здоровья игрока будет не уменьшено, а увеличено, а во втором, наоборот уменьшено. Поэтому можно создать один метод с названием, например changeHealth (float num), который также будет принимать число, на которое нужно изменить уровень текущего здоровья игрока.

Таким образом, этот метод может выглядеть следующим образом:

Пример 6. void changeHealth(float num){ if (((num < 0) and (currentLvlOfHealth > 0)) or ((num > 0) and (currentLvlOfHealth < maxHealth))) currentLvlOfHealth += num; }

Любой класс обладает хотя бы одним методом, идентификатор которого совпадает с идентификатором самого класса. Такой метод называется конструктором и вызывается автоматически при создании объекта этого класса.

Назначение конструктораинициализация объекта.

Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализированных переменных.

Описание объектов

Ранее было разобрано то, что объекты, созданные на основе одного класса, называются экземплярами класса. Иными словами, конкретная переменная типа «класс» и есть экземпляр класса или объект. Время жизни и видимость объектов напрямую зависит от того в каком месте программы она была описана и полностью подчиняется общим правилам языка программирования C++.

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

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

Опираясь на пример, рассмотренный ранее создадим экземпляры класса Player.

Пример 7. Создание экземпляра класса. Player myPlayer; /*объект myPlayer с параметрами по умолчанию*/ Player masPlayer[21]; /*массив объектов с параметрами по умолчанию*/ Player *ptrPlayer = new Player; /*динамический объект*/ Player &player = myPlayer; /*ссылка на объект*/

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

Как правило, в качестве константных описываются те методы, которые позволяют получить значение какого-либо поля.

Классы. Указатели.

Указатель this

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

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

Применить указатель this можно и в явном виде, однако используется в основном для возвращения указателя или ссылки на объект, вызвавший метод.

Чтобы получить указатель в операторе return достаточно указать идентификатор this, если же нужно вернуть ссылку, то необходимо использовать операцию «*». Также этот указатель применяется для идентификации поля класса в том случае, если его идентификатор совпадает с идентификатором формального параметра метода.

Применительно к примеру, рассмотренному выше, создадим метод, возвращающий указатель на уже мёртвого игрока. Т.е. игрока, у которого уровень здоровья находится на 0 или ниже.

Пример 8. Создание метода, возвращающего указатель на экземпляр класса. <…> Player & deceasedPlayer(Player &Pl){ if(Pl.currentLvlOfHealth <= 0) return this; }

В языке программирования Pascal вы рассматривали self -параметр, аналогом которого является указатель this в С++.


Поделиться с друзьями:

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.