Пример
#include <iostream.h>
struct goods // класс “ товар”
{ char name[40]; // наименование товара
float price; // закупочная цена
static int percent; // торговая наценка – статический компонент
// компонентные функции:
void vvod () // ввод данных о товаре
{ cin >> name; cin>> price; }
void vivod () // вывод данных о товаре
{ cout <<”\n” << name;
cout <<”: Розничная цена =”
<< price*(1.0+ goods::percent*0.01);
}
};
int goods::percent =25; // инициализация статического компонента
// статический элемент получает память
// и становится доступным даже без объявления
// объектов
{
goods top [5] ={ { “Костюм “, 10000}, { “Шляпа”, 1100 } };
// инициализация двух объектов из пяти при объявлении массива объектов
for (int i =2; i <5; i++) top [i].vvod();
// вводятся данные в объекты массива с помощью компонентной функции
for(i =0; i<5; i++) top[i].vivod();
// выводятся данные о товарах
goods::percent =30;
// присваивается другое значение статическому компоненту
goods* ptr = top;
// объявлен указатель на объект класса и инициирован
// адресом первого элемента массива top (экв. &top[0])
for(i=0; i <5; i++)
ptr++ -> vivod(); // после каждого вызова функции указатель
|
|
// ”настраивается” на следующий элемент
}
При моделировании списка можно ввести класс
class list {
…
static list * begin; // начало связанного списка
…
};
list* list:: begin = NULL; // выделение памяти и инициализация
… // статического элемента
Доступ к членам класса
Существуют три уровня доступа к данным и функциям, входящим в класс, для каждого из которых предусмотрен свой спецификатор.
1. Данные или функции, описанные после ключевого слова public, являются открытыми (общедоступными). Это означает, что к ним можно обращаться, откуда угодно: из функций данного класса, из функций других классов, из программы. Обычно открывают функции общего назначения, чтобы с их помощью можно было бы посылать сообщения объектам.
2. Данные и функции, описанные после ключевого слова private, являются закрытыми (частными, приватными). Это означает, что к ним можно обращаться только из функций данного класса (открытых или закрытых), из программы к ним обратиться нельзя. Обычно данные класса закрывают, выполняется, так называемый, принцип инкапсуляции данных внутри объекта. Иногда закрывают также и функции, если они обслуживают внутренние задачи класса.
3. Данные и функции, описанные после ключевого слова protected, являются защищенными. Такие члены класса доступны только данному классу и классам, производным от данного. Защищенные отличаются от закрытых членов класса, если имеет место наследование.
Закрытые члены класса недоступны и в производных классах.
Ключевые слова public, private, protected могут встречаться в описании класса в любом порядке и количестве.
|
|
По умолчанию (без использования спецификаторов доступа):
- если класс определен с помощью ключевого слова struct, то все компоненты класса являются общедоступными - глобальны, их статус – public ( не выполняется принцип инкапсуляции данных внутри объекта);
- в классах – объединениях union все элементы класса также общедоступны, но в каждый момент времени исполнения программы объект такого класса содержит только один компонент класса (многократное использование одних и тех же участков памяти для разных целей);
- все компоненты класса, определение которого начинается со служебного слова class, недоступны для внешних обращений - статус private.
Изменить статус доступа компонент при определении класса позволяют спецификаторы доступа: public - общедоступный, private – собственный, protected – защищенный, за которыми помещается двоеточие.
Если в определении появился спецификатор доступа, то до следующего спецификатора все компоненты класса будут иметь указанный статус (protected и private эквивалентныпри использовании классов без порождений).
Как правило, данные объявляют со статусом private, а компонентные функции, с помощью которых можно изменять эти данные, объявляют со статусом public.
class A {
int X; // закрытое по умолчанию данное - член
int Y; // то же
void f (); // закрытая по умолчанию функция - член
protected:
void init (); // защищенная функция, доступная в производных
// классах
public:
void setX (int); // открытая функция
void setY (int); // то же
};
Если статический компонент класса имеет статус private или protected, то к нему извне можно обращаться только через компонентные функции, при наличии уже определенного объекта.
Возможность обращения к статическому элементу без имени конкретного объекта (и до объявления объектов) дает статическая компонентная функция, определенная в классе со спецификатором static.
Такая функция сохраняет все свойства обычных компонентных функций, но дополнительно такую функцию можно вызвать:
имя класса:: вызов статической функции;
Такие функции можно вызывать до определения конкретных объектов класса, и не используя конкретных объектов.
#include <iostream.h>
class goods1 // класс “ товар1”
{
// закрытые по умолчанию данные – члены класса
char name[40]; // наименование товара
float price; // закупочная цена
static int percent; // торговая наценка
public: // открытые члены класса компонентные функции:
void vvod () // ввод данных о товаре
{ cin >> name; cin>> price; }
static void SetPer (int newper) // статическая функция для
{ preset = newper;} // изменения статического элемента
void vivod () // вывод данных о товаре
{ cout <<”\n” << name;
cout <<”: Розничная цена =”
<< price*(1.0+ goods::percent*0.01);
}
};
int goods::percent =25;
// внешнее описаниеи инициализация статического компонента
/* т.к. percent – собственный (закрытый) компонент класса, то последующее обращение к нему возможно только с использованием объектов и открытых компонентных функций или используя общедоступную статическую компонентную функцию */