При вивченні класів пам'яті ми вже зустрічалися з класом static. Специфікатор класу пам'яті static впливає на час життя та область дії змінної чи функції. Змінна, оголошена зі специфікатором класу пам'яті static, існує в єдиному екземплярі в межах області видимості.
Клас пам'яті static може використовуватись і при оголошенні полів класу. Специфіка статичних полів полягає в тому, що вони мають одне й те саме значення в усiх об'єктах даного класу. Іншими словами, якщо описати статичне поле при заданні класу, то в усіх його екземплярів значення відповідного поля завжди буде однаковим. Зміна значення статичного поля в одному з об'єктів класу приведе до зміни цього значення в усіх його екземплярах (для всіх екземплярів класу виділяється одне й те саме місце в пам'яті для збереження статичного поля).
class statpol {
public:
static int i;}a,b,c;
Main()
{a.i=1;
cout<<b.i<<"\n";
cout<<c.i<<"\n";}
Для роботи зі статичним полем у С++ версії 3.11 необхідно оголошувати його за межами протоколу класу. При компіляції наведеного вище прикладу помилки не виникне, але вона виникне на етапі лінкування програми. Щоб її уникнути, необхідне зовнішнє оголошення:
int statpol::i;
Статичні поля можуть ініціалізуватися за допомогою глобальних оголошень типу
int statpol::i=1;
Доступ до статичного поля можна здійснювати й за допомогою операції розширення області видимості, яка застосовується до імені відповідного класу:
Main()
{
statpol a;
a.i=1;
statpol::i=2;
//...}
Допускаються статичні екземпляри класу. Доступ до полів даних і функцій-членів статичних екземплярів класу ззовні функцій-членів цього класу здійснюється за допомогою операції розширення області видимості ::, що застосовується до імені класу, або за допомогою "." чи "-->" (як і для звичайних полів). Наприклад:
static statpol a;
Main()
{cout<<a.i<<"\n";
cout<<statpol::i;}
Статичні поля зручно використовувати у випадку, коли необхідно виконувати операції над усіма екземплярами класу чи зберігати інформацію про них. Статичним полем може бути лічильник екземплярів деякого класу. Наприклад:
Class Point
{floаt x,y;
static Point*first=NULL;
static Point*last=NULL;
Point*next;
publiс:
Point(float ax,float ay)
{x=ax; y=ay;
if(first==NULL){first=this;last=this}
else{last.next=this;last=this;}}
Vоid draw()
{...}