Может кто-нибудь объяснить, как статические переменные в функциях-членах работают в C ++.
Учитывая следующий класс:
class A {
void foo() {
static int i;
i++;
}
}
Если я объявляю несколько экземпляров A
, foo()
увеличивает ли вызов одного экземпляра статическую переменную i
во всех экземплярах? Или только тот, который был вызван?
Я предполагал, что у каждого экземпляра будет своя собственная копия i
, но пошаговое выполнение некоторого кода, который я имею, указывает на обратное.
static int i
специфичной для данного экземпляра, например,o1.foo(); // i = 1
и$o2.foo(); // i = 1
...?m_
для обозначения статуса i.К
static
сожалению, это ключевое слово имеет несколько разных значений в C ++.При использовании для элементов данных это означает, что данные размещаются в классе, а не в экземплярах.
При использовании для данных внутри функции это означает, что данные распределяются статически, инициализируются при первом вводе блока и сохраняются до завершения программы. Также переменная видна только внутри функции. Эта особенность локальной статики часто используется для реализации ленивых конструкций синглетонов.
При использовании на уровне модуля компиляции (модуля) это означает, что переменная похожа на глобальную (то есть размещена и инициализирована до
main
запуска и уничтожена послеmain
выхода), но переменная не будет доступна или видима в других модулях компиляции .Я добавил акцент на части, которая наиболее важна для каждого использования. Использование (3) несколько не рекомендуется в пользу безымянных пространств имен, которые также допускают неэкспортированные объявления классов.
В вашем коде
static
ключевое слово используется со значением номер 2 и не имеет ничего общего с классами или экземплярами ... это переменная функции, и будет только одна ее копия.Как правильно сказал iammilind, однако, могло бы быть несколько экземпляров этой переменной, если функция была функцией шаблона (потому что в этом случае сама функция может присутствовать во многих различных копиях в программе). Даже в этом случае, конечно, классы и экземпляры не имеют значения ... см. Следующий пример:
источник
keyword static unfortunately has a few different unrelated meanings in C++
:)Статические переменные внутри функций
Статическая переменная создается внутри функции и хранится в статической памяти программы, а не в стеке.
Инициализация статической переменной будет производиться при первом вызове функции.
Статическая переменная сохранит значение в нескольких вызовах функций
Время жизни статической переменной - Программа
Примеры
Вывод :
Статическая переменная
Значение переменной: 0
Значение переменной: 1
Значение переменной: 2
Значение переменной: 3
Значение переменной: 4
Авто Переменная
Значение переменной: 0
Значение переменной: 0
Значение переменной: 0
Значение переменной: 0
Значение переменной: 0
источник
Упрощенный ответ:
Статические переменные, независимо от того, являются ли они членами (не шаблонной)
class
или (не шаблонной) функции, ведут себя - технически - как глобальная метка, область действия которой ограниченаclass
функцией или.источник
MyClass& instance(){ static MyClass x("config.ini"); return x; }
допустимая переносимая реализация для однопоточного использования именно потому, что локальная статика НЕ просто похожа на глобальную, несмотря на то, что вы говорите.