Статические члены класса


Класс является типом, а не объектом данных и каждый объект класса имеет свою собственную копию данных членов класса. Некоторые типы реализуются более элегантно, если все объекты этого типа используют совместно некоторые данные. Например для управления задачами в ОС или для моделирования часто используется список всех задач.
Class Task{
//…
task *next;
static task * task _chain;
void shedule(int);
void wait(event);
//…
};
Использование членов класса static может значительно уменьшить потребность в глобальных переменных.

Инициализация статических данных членов класса.
К статическим членам класса Х можно обратиться как к обычным членам – по имени или по указателю на созданный объект с использованием стандартной мнемоники обращения к члену класса, так и по его полному имени, даже в том случае, если в прграмме не создан еще ни один объект класса Х.
Struct s {
Static sm;
//…
};
int s::sm=0;
void f(){
cout<<”s::sm=”<< s::sm<<endl;
cout<<”s.sm=”<< s.sm<<endl;//ошибка
s s;
cout<<”s.sm=”<< s.sm<<endl;
}
Инициализация членов абстрактных типов.
Пример:
Class Coord{
Float x, y, z;
Public:
coord(){x=y=z=0;}
coord(float xv, float yv, float zv=0){
x=xv; y=yv; z=zv;}
coord(coord&c){x=c.x; y=c.y; z=c.z}
};
class Triang{
coord vert1, vert2, vert3;
public;
Triang();
Triang(coord&v1, coord&v2, coord&v3);
}
При инициализации некоторого объекта класса Triang потребуется три раза вызвать конструкторы для его вершин – объектов класса Coord. Язык представляет такую возможность. Для этого в определении (а не просто в объявлении) конструктора класса Triang после двоеточия нужно поместить список обращений к конструкторам класса Coord.
Triang:: Triang(coord&v1, coord&v2, coord&v3);
vert1(v1), vert2(v2), vert3(v3);
{//…}
Копирование
Если Х и Y объекты класса cl то X=Y по умолчанию означает побитовое копирование Y в Х. Имея таким образом интерпретируемое присваивание м/о вызвать нежелательный эффект, когда присваивание применяется к объектам класса для которого определены конструкторы и деструкторы. Используем для примера определенный ранее класс char_stack
Void h(){
Char.stack s1(100);
char_stack s2=s1;
char_stack s3(99);
s3=s2;
}
В этом примере конструктор вызывается 2 раза а деструктор 3.

Загрузка...