Визначення статичних полів класу відбувається не так, як у звичайних полів. Звичайні поля оголошуються (компілятору повідомляється ім’я і тип поля) і визначаються (компілятор виділяє пам’ять для збереження поля) за допомогою одного оператора. Для статичних полів ці дві дії виконуються двома різними операторами: оголошення поля знаходиться всередині визначення класу, а визначення поля, як правило, розміщується поза класом і часто являє собою оголошення глобальної змінної.
static int count; //оголошення статичного поля
int foo:: count=0; //Визначення cтатичного поля
Для чого використовується така двоїста форма? Якби означення статичного поля знаходилося всередині класу, то це порушило б принцип, згідно з яким визначення класу не повинне бути зв’язаним з виділенням пам’яті. Помістивши визначення статичного поля поза класом, ми забезпечили однократне виділення пам’яті під це поле до того, як програма буде запущена на виконання і статичне поле в цьому випадку стане доступним всьому класу. Кожен об’єкт класу вже не буде володіти своїм власним екземпляром поля, як це повинне бути з полями автоматичного типу. В цьому сенсі статичні поля нагадують глобальні змінні.
Працюючи зі статичними даними класу, легко зробити помилки, які не розпізнаються компілятором. Якщо оголосити статичне поле класу, але забути його визначити, компілятор не видасть попередження. Програма вважатиметься коректною, доки редактор зв’язків не виявить помилки і не видасть повідомлення про те, що ми збиралися звернутися до неоголошеної глобальної змінної.