@sanchas

Проблема с локальными статическими переменными. Соответствует ли это стандарту?

Эпиграф: То ли лыжи не едут, то ли я ...
Заметил странную особенность, мне кажется, это неправильное поведение компилятора, но возможно, я плохо знаю стандарт с++. Прошу поделиться мыслями.
Я объявил некоторый класс A. В этом классе A есть функция func, в теле которой объявлены статические переменные.

void A::func()
{
static int a = 0;
static int b = 0;
...
}

Затем я создал классы B, C, D являющиеся наследниками класса A, а так же объекты классов B, C, D.
Именно здесь и начались проблемы. Как выяснилось (после 2 часов отладки вперемежку с нецензурной руганью) статические переменные a, b оказались одними и теми же (хранятся по одному адресу) для всех объектов классов B, C, D.
Разве они не должны быть в каждом объекте класса разными?
  • Вопрос задан
  • 2348 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как выяснилось (после 2 часов отладки вперемежку с нецензурной руганью) статические переменные a, b оказались одними и теми же (хранятся по одному адресу) для всех объектов классов B, C, D.
Разве они не должны быть в каждом объекте класса разными?

Начнём с того, что эти переменные вообще не принадлежат объекту. Это локальные переменные функции. А функция у вас определена одна единственная, A::func. B и C унаследовали это определение, своих функций func у них нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Ключевое слово static как раз предназначено для того чтобы переменная вела себя как глобальная. Почему бы вам не объявить обычный член класса А, тогда он будет принадлежать экземпляру класса?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы