
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. Классы и объекты
Основными концепциями ООП являются три концепции: инкапсуляция, полиморфизм и наследование.
Инкапсуляция – это механизм, который объединяет данные и код, манипулирующий с этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования.
Полиморфизм – это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих задач, но технически разных задач. Примером использования свойства полиморфизма является использование виртуальных функций.
Наследование – это процесс, посредством которого один объект может приобретать свойства другого, точнее объект может наследовать основные свойства другого объекта и добавлять к нему черты, характерные только для него.
Фундаментальными понятиями объектно-ориентированного программирования является понятие класса и объекта. Принципы определения классов и объектов базируются на этих трех основных концепциях.
Класс – это механизм для создания объектов, это описание(абстракция), которая показывает, как построить существующую во времени и пространстве переменную этого класса, называемую объектом класса.
Для создания класса используется формат:
Ключ_класса имя_класса{список компонентов};
Где ключ_класса – одно из служебных слов 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. Перегрузка операций. Перегрузка унарных операций.