Czy ktoś może wyjaśnić, jak zmienne statyczne w funkcjach składowych działają w C ++.
Biorąc pod uwagę następującą klasę:
class A {
void foo() {
static int i;
i++;
}
}
Jeśli zadeklaruję wiele wystąpień A
, czy wywołanie foo()
jednego wystąpienia spowoduje zwiększenie zmiennej statycznej i
we wszystkich wystąpieniach? Czy tylko ten, do którego został wezwany?
Założyłem, że każda instancja będzie miała swoją własną kopię i
, ale przeglądanie kodu, który mam, wydaje się wskazywać inaczej.
static int i
specyficzny dla instancji, tak aby np.o1.foo(); // i = 1
I$o2.foo(); // i = 1
…?m_
wskazujący status i.static
Słowo kluczowe ma niestety kilka różnych niezwiązanych ze sobą znaczeń w C ++Gdy jest używany dla członków danych, oznacza to, że dane są przydzielane w klasie, a nie w instancjach.
W przypadku użycia danych wewnątrz funkcji oznacza to, że dane są przydzielane statycznie, inicjowane przy pierwszym wprowadzeniu bloku i trwają do zakończenia programu. Również zmienna jest widoczna tylko wewnątrz funkcji. Ta szczególna cecha lokalnej statyki jest często używana do implementacji leniwej konstrukcji singletonów.
Gdy jest używana na poziomie jednostki kompilacji (moduł), oznacza to, że zmienna jest podobna do zmiennej globalnej (tj. Jest przydzielana i inicjowana przed
main
uruchomieniem i niszczona pomain
wyjściu), ale zmienna nie będzie dostępna ani widoczna w innych jednostkach kompilacji .Położyłem nacisk na tę część, która jest najważniejsza dla każdego zastosowania. Użycie (3) jest nieco odradzane na rzecz nienazwanych przestrzeni nazw, które również pozwalają na nieeksportowane deklaracje klas.
W twoim kodzie
static
słowo kluczowe ma znaczenie numer 2 i nie ma nic wspólnego z klasami lub instancjami ... jest to zmienna funkcji i będzie tylko jedna jej kopia.Jak słusznie powiedział iammilind , mogłoby jednak istnieć wiele wystąpień tej zmiennej, gdyby funkcja była funkcją szablonu (ponieważ w takim przypadku faktycznie sama funkcja może występować w wielu różnych kopiach w programie). Nawet wtedy, gdy zajęcia i instancje kursu są nieistotne ... zobacz następujący przykład:
źródło
keyword static unfortunately has a few different unrelated meanings in C++
:)Zmienne statyczne wewnątrz funkcji
Zmienna statyczna jest tworzona wewnątrz funkcji i jest przechowywana w pamięci statycznej programu, a nie na stosie.
Inicjalizacja zmiennej statycznej zostanie wykonana przy pierwszym wywołaniu funkcji.
Zmienna statyczna zachowa wartość w wielu wywołaniach funkcji
Okres istnienia zmiennej statycznej to Program
Przykłady
Wynik :
Zmienna statyczna
Wartość zmiennej: 0
Wartość zmiennej: 1
Wartość zmiennej: 2
Wartość zmiennej: 3
Wartość zmiennej: 4
Zmienna automatyczna
Wartość zmiennej: 0
Wartość zmiennej: 0
Wartość zmiennej: 0
Wartość zmiennej: 0
Wartość zmiennej: 0
źródło
Uproszczona odpowiedź:
Zmienne statyczne, niezależnie od tego, czy są członkami funkcji (bez szablonu),
class
czy (bez szablonu), zachowują się - technicznie - jak globalna etykieta, której zakres jest ograniczony doclass
funkcji lub.źródło
MyClass& instance(){ static MyClass x("config.ini"); return x; }
- poprawna przenośna implementacja do użytku w jednym wątku, ponieważ lokalne statystyki NIE są po prostu globalne, pomimo tego, co mówisz.