Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ооп.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
300.54 Кб
Скачать

3. Указатели на объекты

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

Для доступа к членам объекта через сам объект используется оператор «точка» (.). Если же используется указатель на объект, тогда необходимо использовать оператор «стрелка» (—>). Ис­пользование операторов «точка» и «стрелка» аналогично их использованию для структур и объе­динений.

Указатель на объект объявляется с использованием того же синтаксиса, что и указатели на данные других типов. В следующей программе создается простой класс с именем P_example и определяется объект этого класса ob, а также указатель р на объект P_example. Ниже проиллюс­трировано, как получить доступ к объекту ob непосредственно и опосредованно с использовани­ем указателя: // простой пример использования указателя на объект #include <iostream.h> class P_example { int num; public: void set_num(int val) {num = val; } void show_num(); }; void P_example::show_num() { cout << num << " \n"; } int main() { P_example ob, *p; // объявление объекта и указателя на него ob.set_num(1); // прямой доступ к ob ob.show_num(); р = &ob; // присвоение р адреса ob p->show_num(); // доступ к ob с помощью указателя return 0; }

Обратим внимание, что адрес объекта ob получен с использованием оператора взятия адреса & точно так же, как берется адрес переменной любого типа.

Инкремент или декремент указателя изменяет его таким образом, что он всегда указывает на следующий элемент базового типа. То же самое справедливо и для объектов. Следующий пример модифицирует предыдущую программу, в результате чего ob становится массивом из двух эле­ментов типа P_example. Обратим внимание на инкремент и декремент указателя р, с помощью которого осуществляется доступ к элементам массива: // увеличение указателя на объект #include <iostream.h> class P_example { int num; public: void set_num(int val) {num = val;} void show_num(); }; void P_example::show_num() { cout << num << "\n"; } int main() { P_example ob[2], *p; ob[0].set_num(10); // прямой доступ к объекту ob[1].set_num(20); p = &ob[0]; // получение указателя на первый элемент p->show_num(); // вывод значения ob[0] с помощью указателя р++; // переход к следующему объекту p->show_num(); // вывод значения ob[1] с помощью указателя р--; // переход к предыдущему объекту p->show_num(); // вывод значения оb [0] return 0; }

Программа выводит на экран числа 10, 20, 10.

  1. Определение класса и объекта. Основные понятия и составные класса.

1.1. Классы и объекты

Основными концепциями ООП являются три концепции: инкапсуляция, полиморфизм и наследование.

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

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

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

Фундаментальными понятиями объектно-ориентированного программирования является понятие класса и объекта. Принципы определения классов и объектов базируются на этих трех основных концепциях.

Класс – это механизм для создания объектов, это описание(абстракция), которая показывает, как построить существующую во времени и пространстве переменную этого класса, называемую объектом класса.

Для создания класса используется формат:

Ключ_класса имя_класса{список компонентов};

Где ключ_класса – одно из служебных слов class, struct, union;

Имя_класса – произвольно выбранный идентификатор;

Список_компонентов – определения и описания типизированных данных и принадлежащих классу функций.

Описание классов напоминает описание структур. Структуры и объединения также рассматриваются в языке Си++ как классы.

Более общее описания класса имеет вид:

ключ_класса имя_класса <: список_родителей >

{список_элементов};

Компонентами класса могут быть данные, функции, классы, перечисления, битовые поля, дружественные функции, дружественные классы и имена типов.

Наиболее простыми и часто используемыми компонентами класса являются типизированные данные(базовые и производные) и функции.

Наиболее часто используемым, является ключ_класса – class.

При определении класса все функции и данные по умолчанию становятся закрытыми для класса, т.е. по умолчанию они имеют идентификатор доступа private.

Существуют три типа доступа к данным:

  • private – скрытый;

  • protected – защищенный;

  • public – открытый.

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

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

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

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

Имя_класса имя_объекта;

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

Возможны следующие варианты доступа к компонентам объекта:

а) С помощью уточнения имени следующего формата:

Имя_объекта.имя_класса::имя_компонента

Где «::» - операция уточнения.

Имя_класса и операция уточнения «::» могут быть опущены.

Тогда формат доступа к компонентам объекта следующий

Имя_объекта.имя_компонента.

Пример:

ob.myclass::myfunc();

или

ob.myfunc();

б) С помощью использования указателя:

Указатель_на_объект_класса->имя_элемента.

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

Пример:

myclass ob;

myclas *p;

p=&ob;

p->get();

5. Перегрузка операций. Перегрузка унарных операций.