Шаг 3.
Способы доступа к компонентам класса. Использование указателей

    На этом шаге мы рассмотрим использование указателей для доступа к компонентам класса.

    Другой способ доступа к элементам объекта некоторого класса предусматривает явное использование указателя на объект класса и операции косвенного выбора компонента ('->'):

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

    Воспользовавшись указателем 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();


    Пример 1. Рассмотрим класс, описывающий товары на складе магазина. Компонентами класса будут: Определение класса:
   //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;

    Это предложение должно быть размещено в глобальной области после определения класса. Только при инициализации статический компонент класса получает память и становится доступным. Для обращения к статическому компоненту используется квалифицированное имя:

    имя_класса::имя_компонента
Кроме того, статический компонент доступен "через" имя конкретного объекта:
   имя_объекта.имя_класса::имя_компонента
либо
   имя_объекта.имя_компонента


    Пример 2. В следующей программе иллюстрируются перечисленные возможности и особенности классов со статическими компонентами, а также используется массив объектов:
//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.

    На следующем шаге мы начнем говорить о конструкторах.




Предыдущий шаг Содержание Следующий шаг