Инициализация
book tip3 = {“Язык С++”}; - // объявление объекта класса book с
// инициализацией
Можно сразу объявлять объекты при объявлении класса, поместив имя объекта (или имена объектов) после закрывающей фигурной скобки.
При определении объекта выделяется память для всех данных объекта, т.е. для каждого элемента объекта в соответствии с его типом.
Статический компонент класса
Каждый объект одного и того же класса имеет собственную копию данных класса.
Т.е. данные класса тиражируются при каждом создании объекта.
Иногда возникает необходимость объявить данные общие для всех объектов данного класса.
Например,
- если нужен счетчик объектов данного класса,
-или для объектов, связанных в список, для работы со всем списком (напр. просмотр) нужен указатель на начало списка – общий для всех связанных объектов,
-может понадобиться указатель на последний элемент списка и. т. д.
Такие данные можно сделать компонентами класса, но их надо объявить так, чтобы они не тиражировались от объекта к объекту, а существовали в единственном экземпляре.
Такой элемент должен быть определен в классе как статический.
Статический элемент должен быть определен со спецификатором static (выделяется память при его определении и сохраняется до окончания действия программы)
Статический элемент класса не дублируется при создании новых объектов класса.
3) Каждый статический элемент существует в единственном экземпляре и память на него выделяется при его инициализации.
4) Инициализация статического компонента размещается в глобальной области сразу после определения класса, с этого момента статический элемент становится доступным даже до объявления объектов данного класса.
Инициализация:
тип_ компонента имя_класса :: имя_компонента инициализатор.
С этого момента статический компонент класса становится доступным (если он открыт) даже до объявления объектов данного класса по квалифицированному имени:
имя_ класса :: имя_ компонента.
После объявления объектов к статическому полю данных можно также обращаться как к обычному полю данных, то есть с использованием операций выбора (. и ->).
При этом любые изменения (в любом объекте) статического элемента становятся общими для всех объектов данного класса.
При этом любые изменения (в любом объекте) статического элемента – становятся общими для всех объектов данного класса.
Рассмотрим использования статических полей данных.
#include <iostream>
using namespace std;
struct goods { // класс "товары"
char name[40]; // наименование товара
double price; // закупочная цена
static int percent; // торговая наценка в % – статический компонент
//методы для объектов класса:
void vvod ( ) // ввод данных о товаре
{cin >> name; cin>> price;}
void vivod ( ) { // вывод данных о товаре
cout <<"\n" << name ;
cout <<" - розничная цена =";
cout << price*(1.0+ goods::percent*0.01)<<endl;
}};
int goods::percent =25; // инициализация статического компонента
int main (void) {
// определяется массив из 5 объектов, для двух объектов проводится //инициализация
goods top [5] ={ {"Костюм ", 10000}, { "Шляпа", 1100 } };
// вводятся данные в оставшиеся объекты массива с помощью метода vvod( )
for (int i =2 ; i <5 ; i++ ) top [i].vvod();
cout<<"\nСписок товаров при наценке " <<
top[0]. percent<< "%"<<endl;
// выводятся данные о товарах
for( i =0 ; i<5 ; i++ ) top[i].vivod( );
// присваивается другое значение статическому компоненту
goods::percent =30;
//объявляем указатель на объект класса и инициализируем его
//адресом первого элемента массива top
goods* ptr = top;
cout<<"\nСписок товаров при наценке " <<
top[0]. percent<< "%"<<endl;
for(i=0 ; i <5 ; i++ ) ptr++ -> vivod ();
return 0;
}
Результатом выполнения программы будут два списка тех же товаров, но с разной наценкой.
При моделировании связанного списка можно так определить класс:
class list { …
static list * begin; // указатель на вершину связанного списка
… };
list* list :: begin = NULL; //инициализация статического элемента
