Klassy_i_obekty_v_CNEWWWW1852184512015462.ppt
- Количество слайдов: 35
Классы и объекты в C++
• Класс - не что иное, как структура, к которой добавили функции. • Объект - это структурная переменная. Если: то: ТИП переменная КЛАСС объект
Определение класса должно располагаться до main. class soldier { public: int x, y; int ammo; }; • В заголовке вместо ключевого слово struct стоит class. • В первой строке определения класса стоит public с двоеточием.
Создадим переменную типа soldier a; a. x = 3; a. y = 4; a. ammo = 5; Здесь мы создали объект a класса soldier. Совсем никаких отличий от структурных переменных. В данном случае объекты (переменные классов) можно использовать также, как и структурные переменные.
Спецификаторы доступа public и private По умолчанию в структурах используется спецификатор доступа public, а в классах private. Рассмотрим примеры без спецификаторов: struct soldier class soldier { { int x, y; }; }; Здесь между структурами и классами есть важное различие. Вот как на самом деле выглядят предыдущие определения: struct soldier class soldier { { public: private: int x, y; }; }; Компилятор автоматически вставляет public и private. В структурах по умолчанию используется public, в классах по умолчанию используется private.
Спецификатор доступа public class soldier { public: int x, y; }; • Данный спецификатор по умолчанию используется в структурах. Чтобы использовать его в классах, нужно объявлять его явно. • Спецификатор public позволяет переменным/объектам, созданным на основе данной структуры/класса, получить доступ к полям. soldier a; a. x = 3; cout << a. x << "n"; В данном случае использование классов ничем не отличается от структур.
Спецификатор доступа private • Мы всегда будем объявлять спецификаторы доступа явно: и private и public. class soldier { private: При выполнении int ammo; этого примера, компилятор public: int x, y; } выдаст ошибку. Мы не можем обращаться к полю ammo за пределами класса. soldier a; a. x = 3; a. y = 4; a. ammo = 5; // !!! Данный код некорректен
• За пределами класса - значит, в любом месте за фигурными скобками определения класса. Если объект класса пытается получить доступ к переменной класса (a. ammo), это тоже считается "за пределами класса". • Спецификаторы доступа (и public, и private) действуют с того момента, как они появляются в классе и до того момента, когда встречается другой спецификатор или определение класса не заканчивается. • Для чего же всё-таки определять переменные в блоке со спецификатором public? Дело в том, что классы, помимо переменных, могут содержать и функции.
Функции в классах Объявим функцию в структуре class soldier { public: int x, y; soldier a; a. x=0; a. y=0; a. move(1, 1); void move (int dx, int dy) { x += dx; y += dy; } }; Внутри функции мы определили функцию move. Заметьте, в неё не нужно передавать объекты класса- функция сама знает, какой объект его вызвал. , dx и dy – значения, на которые изменятся поля класса.
Сокрытие данных • Теперь разберёмся, для чего нужен спецификатор доступа private. Рассмотрим пример: class soldier { private: int x, y; public: void move(int dx, int dy) { x += dx; y += dy; } }; У нас нет доступа к переменным x, y. Но они доступны внутри класса. Функция move также имеет к ним доступ, так как она является функцией класса soldier. Теперь, изменить x и y можно только с помощью функции move. x и y скрыты.
Конструктор • Конструктор - это обычная функция, только в ней нет возвращаемого значения. Имя конструктора совпадает с именем класса. Конструктор должен располагаться в блоке public. class soldier void move (int dx, int dy) { { x += dx; private: y += dy; int x, y; } }; public: soldier () // конструктор { x = 0; // инициализация переменных y = 0; } Конструктор вызывается при создании объектов класса:
Деструктор Эта функция вызывается при удалении объекта. Имя деструктора совпадает с именем класса, но с символом ~ в начале. Class myclass { Int a; Public: Myclass(); //конструктор ~myclass(); //деструктор Void show(); };
• Деструктор класса вызывается при удалении объекта. • Локальные объекты удаляются только тогда , когда они выходят из области видимости • Глобальные объекты удаляются при завершении программы. • Адреса конструктора и деструктора получить невозможно!!!
Наследование классов
Наследование Насле дование — механизм объектноориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков!!!
Графическое изображение иерархий наследования Животное Рыба Родительский класс Птица Орел Классы-потомки Голубь Классы-потомки
Наследование в С++ class A{ }; class B : public A{ //базовый класс //public наследование }; class C : protected A{ //protected наследование };
class Z : private A{ /*private наследование*/ };
Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.
Инкапсуляция
Инкапсуля ция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (то, что у него внутри), а взаимодействовать с ним посредством предоставляемого интерфейса , а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только интерфейс — спецификация объекта.
class A { public: int a, b; //данные открытого интерфейса int Return. Something(); //метод открытого интерфейса private: int Aa, Ab; //скрытые данные void Do. Something(); //скрытый метод };
1. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public. 2. Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.
Виртуальные Функции
Виртуальные методы Метод класса может быть объявлен виртуальным, если допускается его альтернативная реализация в порожденном классе При вызове виртуальной функции через указатель или ссылку на объект базового класса будет вызвана реализация данной функции, специфичная для фактического типа объекта Виртуальные функции обозначаются в объявлении класса при помощи ключевого слова virtual Виртуальные функции позволяют использовать полиморфизм Полиморфизм позволяет осуществлять работу с разными реализациями через один и тот же интерфейс
Особенности реализации виртуальных функций в C++ В C++ функции, объявленные в базовом классе виртуальными, остаются виртуальными в классахпотомках Использовать слово virtual в классах наследниках не обязательно (хотя и желательно) В C++ виртуальные функции не являются виртуальными, если они вызваны в конструкторе или деструкторе данного класса Такое поведение специфично для механизма инициализации и разрушения объектов в C++; в других языках программирования может быть по-другому
Композиция
Что такое композиция? Композиция (агрегирование, включение) – простейший механизм для создания нового класса путем объединения нескольких объектов существующих классов в единое целое При агрегировании между классами действует «отношение принадлежности» У машины есть кузов, колеса и двигатель У человека есть голова, руки, ноги и тело У треугольника есть вершины Вложенные объекты обычно объявляются закрытыми (private) внутри класса-агрегата
Пример - Автомобиль // Колесо class CWheel {. . . }; // Кузов class CBody {. . . }; // Двигатель class CEngine {. . . }; // Автомобиль class CAutomobile { public: . . . private: CBody m_body; CEngine m_engine; CWheel m_wheels[4]; };
Полиморфизм
Полиморфизм представляет собой способность объекта изменять форму во время выполнения программы
Полиморфный объект представляет собой такой объект, который может изменять форму во время выполнения программы. Для создания полиморфного объекта ваша программа должна использовать указатель на объект базового класса. Далее программа должна присвоить этому указателю адрес объекта производного класса. Каждый раз, когда программа присваивает указателю адрес объекта другого класса, объект этого указателя (который является полиморфным) изменяет форму. Программы строят полиморфные объекты, основываясь на виртуальных функциях базового класса.
Klassy_i_obekty_v_CNEWWWW1852184512015462.ppt