На этом шаге мы рассмотрим использование указателей для доступа к компонентам класса.
Другой способ доступа к элементам объекта некоторого класса предусматривает явное использование указателя на объект класса и операции косвенного выбора компонента ('->'):
указателъ_на_объект_класса -> имя_элемента
Воспользовавшись указателем point, который адресует объект D класса complex1, можно следующим образом присвоить значения данным объекта D:
. . . . . complex1 X1, Х2, D; // Три объекта класса complex1. complex1 *point = &D; // Указатель на объект класса complex1. complex1 dim[8]; // Массив объектов класса complex1. complex1 &Name = X2; // Ссылка на объект класса complex1. . . . . . point->real = 2.3; // Присваивание значения элементу объекта D. point->imag = 6.1; // Присваивание значения элементу объекта D.
Указатель на объект класса позволяет вызывать принадлежащие классу функции для обработки данных того объекта, который адресуется указателем. Формат вызова функции:
укаэатель_на_объект_класса -> обращение_к_компонентной_функции .
Например, вызвать компонентную функцию display() для данных объекта D позволяет выражение
point->display();
//OOP3_1.CPP - класс "товары на складе магазина". #include <iostream.h> struct goods // Определение класса "товары". { char name[40]; // Наименование товара. float price; // Оптовая (закупочная) цена. static int percent; // Торговая наценка, в %. // Компонентные функции: void Input() // Ввод сведений о товаре. { cout << "Наименование товара: "; cin >> name; cout << "Закупочная цена: "; cin >> price; } void Display() // Вывод данных о продаваемом товаре. { cout << "\n" << name; cout << ", розничная цена: "; cout << long(price * (1.0 + goods::percent * 0.01)); } };
Торговая наценка определена как статический компонент класса. Статические компоненты классов не "дублируются" при создании объектов класса, т.е. каждый статический компонент существует в единственном экземпляре. Доступ к статическому компоненту возможен только после его инициализации. Для инициализации используется конструкция:
тип имя_класса::имя_компонента = инициализатор;
int goods::percent = 12;
Это предложение должно быть размещено в глобальной области после определения класса. Только при инициализации статический компонент класса получает память и становится доступным. Для обращения к статическому компоненту используется квалифицированное имя:
имя_класса::имя_компонента
имя_объекта.имя_класса::имя_компонента
имя_объекта.имя_компонента
//OOP3_2.СРР - массив объектов класса goods. #include <iostream.h> #include "oop3_1.cpp" // Текст определения класса. // Инициализация статического компонента: int goods::percent = 12; void main(void) { goods wares[5] = { { "Мужской костюм", 2500 }, { "Косметический набор", 450 }, { "Калькулятор", 30 } }; int k = sizeof (wares) / sizeof(wares[0]); cout << "\nВведите сведения о товарах:\n"; for (int i = 3; i < k; i++) wares[i].Input(); cout << "\nСписок товаров при наценке " << wares[0].percent << "%"; for (i =0; i < k; i++) wares[i].Display(); // Изменение статического компонента: goods::percent = 10; cout << "\n\nСписок товаров при наценке " << wares [0].goods::percent << "%"; goods *pGoods = wares; for (i = 0; i < k; i++) pGoods++->Display(); }
Результаты выполнения программы:
Введите сведения о товарах: Наименование товара: Сигареты Закупочная цена: 320 Наименование товара: Кроссовки Закупочная цена: 350 Список товаров при наценке 12% Мужской костюм, розничная цена: 2800 Косметический набор, розничная цена: 504 Калькулятор, розничная цена: 33 Сигареты, розничная цена: 358 Кроссовки, розничная цена: 392 Список товаров при наценке 10% Мужской костюм, розничная цена: 2750 Косметический набор, розничная цена: 495 Калькулятор, розничная цена: 33 Сигареты, розничная цена: 352 Кроссовки, розничная цена: 385
Обратите внимание на инициализацию первых элементов массива wares[5] объектов класса goods. В списках значений не отражено существование статического компонента. Точно так же при вводе данных компонентной функцией Input() не изменяется значение статического компонента. Он ведь один для всех объектов класса! Для иллюстрации разных способов доступа к компонентам классов определен указатель pGoods на объекты класса goods. Он инициализирован значением адреса первого элемента массива объектов &wares[0]. В цикле указатель с операцией "->" используется для вызова компонентной функции Display(). После каждого вызова указатель изменяется - настраивается на следующий элемент массива, т.е. на очередной объект класса goods.
На следующем шаге мы начнем говорить о конструкторах.