To słowo kluczowe static
ma w C ++ kilka znaczeń, które uważam za bardzo mylące i nigdy nie mogę oprzeć myśli o tym, jak powinno ono działać.
Z tego, co rozumiem, istnieje static
czas przechowywania, co oznacza, że trwa przez cały okres istnienia programu w przypadku globalnym, ale gdy mówisz o lokalnym, oznacza to, że domyślnie jest on zerowany.
Standard C ++ mówi to dla członków danych klasy ze słowem kluczowym static
:
3.7.1 Statyczny czas przechowywania [basic.stc.static]
3 Słowo kluczowe static może być użyte do zadeklarowania zmiennej lokalnej o statycznym czasie przechowywania.
4 Słowo kluczowe static zastosowane do elementu danych klasy w definicji klasy określa czas przechowywania statycznego elementu danych.
Co to znaczy ze zmienną lokalną ? Czy to lokalna zmienna funkcji? Ponieważ jest też to, że kiedy deklarujesz funkcję lokalną static
, ponieważ jest ona inicjalizowana tylko raz, po raz pierwszy wchodzi w tę funkcję.
Mówi także tylko o czasie przechowywania w odniesieniu do członków klasy, a co z tym, że nie jest specyficzne dla instancji, to także właściwość „ static
nie”? A może to czas przechowywania?
A teraz co ze sprawą static
i zakresem pliku? Czy domyślnie uważa się, że wszystkie zmienne globalne mają statyczny czas przechowywania? Wydaje się to wskazywać na to (z sekcji 3.7.1):
1 Wszystkie zmienne, które nie mają dynamicznego czasu przechowywania, nie mają czasu przechowywania wątków i nie są lokalne, mają statyczny czas przechowywania. Przechowywanie tych podmiotów będzie trwało przez czas trwania programu (3.6.2, 3.6.3)
Jak static
odnosi się do powiązania zmiennej?
To całe static
słowo kluczowe jest wręcz mylące, czy ktoś może wyjaśnić różne zastosowania tego języka w języku angielskim, a także powiedzieć mi, kiedy należy zainicjować członka static
klasy?
Odpowiedzi:
Zmienne:
static
istnieją zmienne dla „okresu istnienia” jednostki tłumaczeniowej, w której jest zdefiniowane , oraz:constexpr
. Cokolwiek innego, a skończysz z osobną zmienną w każdej jednostce tłumaczeniowej, co jest szalenie mylące)static
, ale mogą być zaadresowane zarówno z klasy, jak i instancji (jakstd::string::npos
). [Uwaga: możesz zadeklarować elementy statyczne w klasie, ale zwykle powinny one być nadal zdefiniowane w jednostce tłumaczenia (plik cpp), i jako taki, jest tylko jeden na klasę]lokalizacje jako kod:
Przed wykonaniem jakiejkolwiek funkcji w jednostce tłumaczącej (prawdopodobnie po
main
rozpoczęciu wykonywania) zmienne o statycznym czasie przechowywania (zakres przestrzeni nazw) w tej jednostce tłumaczącej będą „inicjalizowane na stałe” (wconstexpr
miarę możliwości lub w przeciwnym razie zero), a następnie locals są „dynamicznie inicjowane” poprawnie w kolejności, w jakiej są zdefiniowane w jednostce tłumaczeniowej (dla takich rzeczystd::string="HI";
nie sąconstexpr
). Na koniec, funkcja-lokalna statyka zostanie zainicjalizowana, gdy wykonanie po raz pierwszy „osiągnie” linię, w której zostały zadeklarowane. Wszystkiestatic
zmienne zostały zniszczone w odwrotnej kolejności inicjalizacji.Najłatwiejszym sposobem na uzyskanie tego wszystkiego jest uczynienie wszystkich zmiennych statycznych, które nie zostały
constexpr
zainicjalizowane, lokalnymi funkcjami, co zapewnia, że wszystkie statystyki / globały są poprawnie inicjowane podczas próby ich użycia bez względu na wszystko, co zapobiega inicjalizacji statycznej zamów fiasko .Bądź ostrożny, ponieważ gdy specyfikacja mówi, że zmienne zakresu nazw mają domyślnie „statyczny czas przechowywania”, oznaczają one bit „żywotności jednostki tłumaczeniowej”, ale to nie znaczy, że nie można uzyskać do niego dostępu poza plikiem.
Funkcje
Znacznie prostszy,
static
jest często używany jako funkcja członka klasy i tylko bardzo rzadko stosowany jako funkcja wolnostojąca.Statyczna funkcja składowa różni się od zwykłej funkcji składowej tym, że można ją wywoływać bez wystąpienia klasy, a ponieważ nie ma ona wystąpienia, nie ma dostępu do niestatycznych członków klasy. Zmienne statyczne są przydatne, gdy chcesz mieć funkcję dla klasy, która absolutnie nie odnosi się do żadnych elementów instancji lub do zarządzania
static
zmiennymi elementów.static
Wolnego funkcja oznacza, że funkcja nie będzie określana przez inną jednostkę translacji, a zatem łącznik może ignorować go całkowicie. Ma to niewielką liczbę celów:static void log(const char*) {}
w każdym pliku cpp i każdy z nich może zalogować się w inny sposób.źródło
classname::
zakres. Statyczne funkcje składowe klasy są jak funkcje globalne, ale mają zasięg do klasy lub jak zwykłe składowe, ale bez nichthis
(to nie jest wybór - te dwa powinny być równoważne).namespace A { static int x; }
, co oznacza wewnętrzne powiązanie i bardzo różni się od zachowania członków danych klasy statycznej .Statyczny czas przechowywania oznacza, że zmienna przebywa w tym samym miejscu w pamięci przez cały okres istnienia programu.
Powiązanie jest do tego ortogonalne.
Myślę, że to najważniejsze rozróżnienie, jakie możesz zrobić. Zrozum to i resztę, a także pamiętaj o tym, powinno to być łatwe (nie zwracając się bezpośrednio do @Tony, ale ktokolwiek może to przeczytać w przyszłości).
Słowo kluczowe
static
może być użyte do oznaczenia wewnętrznego połączenia i przechowywania statycznego, ale w gruncie rzeczy są one różne.Tak. Niezależnie od tego, kiedy zmienna zostanie zainicjowana (przy pierwszym wywołaniu funkcji i kiedy ścieżka wykonania osiągnie punkt deklaracji), pozostanie w tym samym miejscu w pamięci przez cały czas życia programu. W takim przypadku
static
daje to przechowywanie statyczne.Tak, wszystkie globały mają z definicji statyczny czas przechowywania (teraz, gdy wyjaśniliśmy, co to oznacza). Ale zmienne o zasięgu przestrzeni nazw nie są deklarowane
static
, ponieważ dałoby im to wewnętrzne powiązanie, a więc zmienną na jednostkę tłumaczenia.Daje wewnętrzne powiązanie zmiennych o zasięgu nazw. Daje członkom i zmiennym lokalnym czas przechowywania statyczny.
Rozwińmy to wszystko:
Zdecydowanie, chyba że go znasz. :) Próbując uniknąć dodawania nowych słów kluczowych do języka, komitet ponownie użył tego, IMO, w tym celu - zamieszanie. Jest używany do oznaczania różnych rzeczy (powiedziałbym, prawdopodobnie przeciwnych).
źródło
static int x
w zakresie przestrzeni nazw, daje to niestatyczną pamięć?Aby wyjaśnić pytanie, wolę kategoryzować użycie słowa kluczowego „statycznego” w trzech różnych formach:
(ZA). zmienne
(B). Funkcje
(DO). zmienne składowe / funkcje klas
wyjaśnienie poniżej znajduje się dla każdego z podtytułów:
(A) słowo kluczowe „static” dla zmiennych
Ten może być trochę trudny, ale jeśli zostanie odpowiednio wyjaśniony i zrozumiany, jest dość prosty.
Aby to wyjaśnić, po pierwsze, naprawdę warto wiedzieć o zakresie, czasie trwania i powiązaniu zmiennych, bez których rzeczy zawsze trudno jest dostrzec przez mętną koncepcję standardowego słowa kluczowego
1. Zakres : określa, gdzie w pliku zmienna jest dostępna. Może być dwojakiego rodzaju: (i) Lokalny lub Blokowy . (ii) Globalny zakres
2. Czas trwania : określa, kiedy zmienna jest tworzona i niszczona. Ponownie jest on dwojakiego rodzaju: (i) Automatyczny czas przechowywania (dla zmiennych o zasięgu lokalnym lub blokowym). (ii) Statyczny czas przechowywania (dla zmiennych o zasięgu globalnym lub zmiennych lokalnych (w funkcji lub w bloku kodu) ze specyfikatorem statycznym ).
3. Łączenie : Określa, czy można uzyskać dostęp do zmiennej (lub połączyć ją) w innym pliku. Ponownie (i na szczęście) jest on dwojakiego rodzaju: (i) Wewnętrzne powiązanie (dla zmiennych mających zakres bloku i zakres globalny / zakres pliku / zakres globalnej przestrzeni nazw) (ii) Połączenie zewnętrzne (dla zmiennych mających tylko zakres globalny / zakres pliku / Globalny zakres przestrzeni nazw)
Odwołajmy się do poniższego przykładu, aby lepiej zrozumieć zwykłe zmienne globalne i lokalne (brak zmiennych lokalnych ze statycznym czasem przechowywania):
Teraz pojawia się koncepcja powiązania. Gdy zmienna globalna zdefiniowana w jednym pliku ma być używana w innym pliku, powiązanie zmiennej odgrywa ważną rolę.
Powiązanie zmiennych globalnych określają słowa kluczowe: (i) statyczny i (ii) zewnętrzny
(Teraz dostajesz wyjaśnienie)
statyczne słowo kluczowe można zastosować do zmiennych o zasięgu lokalnym i globalnym, aw obu przypadkach oznaczają one różne rzeczy. Najpierw wyjaśnię użycie słowa kluczowego „static” w zmiennych o zasięgu globalnym (gdzie wyjaśnię również użycie słowa kluczowego „extern”), a później tych o zasięgu lokalnym.
1. Statyczne słowo kluczowe dla zmiennych o zasięgu globalnym
Zmienne globalne mają statyczny czas trwania, co oznacza, że nie wykraczają poza zakres, gdy kończy się określony blok kodu (np. Main ()), w którym jest używany. W zależności od powiązania można uzyskać do nich dostęp tylko w tym samym pliku, w którym są zadeklarowane (dla statycznej zmiennej globalnej), lub poza plikiem, nawet poza plikiem, w którym zostały zadeklarowane (zmienne globalne typu zewnętrznego)
W przypadku zmiennej globalnej mającej specyfikator zewnętrzny i jeśli dostęp do tej zmiennej jest uzyskiwany poza plikiem, w którym została zainicjowana, należy ją zadeklarować w pliku, w którym jest używana, tak jak funkcja musi być przekazana do przodu zadeklarowane, jeśli jego definicja znajduje się w pliku innym niż miejsce, w którym jest używana.
Natomiast jeśli zmienna globalna ma słowo kluczowe static, nie można jej użyć w pliku, poza którym została zadeklarowana.
(patrz wyjaśnienie poniżej)
na przykład:
main3.cpp
teraz dowolna zmienna w c ++ może być stała lub nie-stała i dla każdej „const-ness” otrzymujemy dwa przypadki domyślnego połączenia c ++, w przypadku gdy nie zostanie określona żadna:
(i) Jeśli zmienna globalna nie jest stała, jej łączenie jest domyślnie zewnętrzne , tj. do niestałej zmiennej globalnej można uzyskać dostęp w innym pliku .cpp poprzez deklarację przesyłania dalej za pomocą słowa kluczowego extern (innymi słowy, niestała globalna zmienne mają powiązanie zewnętrzne (oczywiście ze statycznym czasem trwania)). Również użycie słowa kluczowego extern w oryginalnym pliku, w którym został zdefiniowany, jest zbędne. W takim przypadku, aby stała zmienna globalna stała się niedostępna dla pliku zewnętrznego, należy użyć specyfikatora „static” przed typem zmiennej .
(ii) Jeśli zmienna globalna jest stała, jej łączenie jest domyślnie statyczne , tj. stała zmienna globalna nie może być dostępna w pliku innym niż tam, gdzie została zdefiniowana (innymi słowy, stałe zmienne globalne mają wewnętrzne powiązanie (z czasem trwania statycznym oczywiście)). Również użycie słowa kluczowego static, aby uniemożliwić dostęp do stałej zmiennej globalnej w innym pliku, jest zbędne. Tutaj, aby stała zmienna globalna miała zewnętrzny link, użyj specyfikatora „extern” przed typem zmiennej
Oto podsumowanie globalnych zmiennych zasięgu z różnymi powiązaniami
Następnie badamy, jak zachowują się powyższe zmienne globalne, gdy są dostępne w innym pliku.
2. Statyczne słowo kluczowe dla zmiennych o zasięgu lokalnym
Aktualizacje (sierpień 2019 r.) Statycznego słowa kluczowego dla zmiennych w zasięgu lokalnym
Można to dodatkowo podzielić na dwie kategorie:
(i) słowo kluczowe static dla zmiennych w bloku funkcyjnym oraz (ii) słowo kluczowe static dla zmiennych w nienazwanym bloku lokalnym.
(i) słowo kluczowe static dla zmiennych w bloku funkcyjnym.
Wcześniej wspomniałem, że zmienne o zasięgu lokalnym mają automatyczny czas trwania, tj. Powstają, gdy blok jest wprowadzany (czy to zwykły blok, czy to blok funkcyjny), i przestają istnieć, gdy blok się kończy, krótko mówiąc, zmienne z zasięgiem lokalnym mają automatyczny czas trwania i automatyczne zmienne czasu trwania (i obiekty) nie mają powiązania, co oznacza, że nie są widoczne poza blokiem kodu.
Jeśli specyfikator statyczny jest zastosowany do zmiennej lokalnej w bloku funkcyjnym, zmienia on czas trwania zmiennej z automatycznej na statyczną, a jej czas życia to cały czas trwania programu, co oznacza, że ma on stałe położenie w pamięci, a jego wartość jest inicjowana tylko raz przed uruchomieniem programu, jak wspomniano w dokumentacji cpp (inicjalizacji nie należy mylić z przypisaniem)
spójrzmy na przykład.
Patrząc na powyższe kryterium dla statycznych zmiennych lokalnych i statycznych zmiennych globalnych, można pokusić się o pytanie, jaka może być różnica między nimi. Natomiast zmienne globalne są dostępne w dowolnym momencie w ciągu kodu (w samo jak jednostka różni się w zależności od tłumaczenia const -ness i extern -ness), zmienna statyczna zdefiniowana w bloku funkcyjnego nie jest bezpośrednio dostępne. Zmienna musi zostać zwrócona przez wartość funkcji lub odwołanie. Pokażmy to na przykładzie:
Więcej wyjaśnień na temat wyboru statycznej globalnej i statycznej zmiennej lokalnej można znaleźć w tym wątku przepływu stosu
(ii) statyczne słowo kluczowe dla zmiennych w nienazwanym bloku lokalnym.
do zmiennych statycznych w bloku lokalnym (nie bloku funkcyjnym) nie można uzyskać dostępu poza blokiem, gdy blok lokalny wykracza poza zakres. Żadnych zastrzeżeń do tej zasady.
C ++ 11 wprowadził słowo kluczowe,
constexpr
które gwarantuje ocenę wyrażenia w czasie kompilacji i pozwala kompilatorowi zoptymalizować kod. Teraz, jeśli wartość stałej stałej statycznej w zakresie jest znana w czasie kompilacji, kod jest optymalizowany w sposób podobny do tego zconstexpr
. Oto mały przykładPolecam także czytelnikom, aby sprawdzili różnicę między zmiennymi
constexpr
istatic const
dla zmiennych w tym wątku przepełnienia stosu . to kończy moje wyjaśnienie statycznego słowa kluczowego stosowanego do zmiennych.B. słowo kluczowe „static” używane dla funkcji
pod względem funkcji słowo kluczowe static ma bezpośrednie znaczenie. Tutaj odnosi się do powiązania funkcji Zwykle wszystkie funkcje zadeklarowane w pliku cpp mają domyślnie powiązanie zewnętrzne, tj. Funkcja zdefiniowana w jednym pliku może być użyta w innym pliku cpp poprzez deklarację przesyłania dalej.
użycie statycznego słowa kluczowego przed deklaracją funkcji ogranicza jego powiązanie z wewnętrznym , tzn. funkcja statyczna nie może być używana w pliku poza jego definicją.
C. Staitc Słowo kluczowe używane do zmiennych składowych i funkcji klas
1. Słowo kluczowe „static” dla zmiennych składowych klas
Zaczynam bezpośrednio od przykładu tutaj
W tym przykładzie zmienna statyczna m_designNum zachowuje swoją wartość, a ta pojedyncza zmienna prywatna (ponieważ jest statyczna) jest współużytkowana przez wszystkie zmienne typu obiektu DesignNumber
Podobnie jak inne zmienne składowe, statyczne zmienne składowe klasy nie są powiązane z żadnym obiektem klasy, o czym świadczy wydrukowanie dowolnej liczby w funkcji głównej
const vs niestałe statyczne zmienne składowe w klasie
(i) niestacjonarne zmienne klasy członka W poprzednim przykładzie statyczne elementy (publiczne i prywatne) nie były stałymi. Norma ISO zabrania inicjowania elementów niestałych w klasie. Dlatego, podobnie jak w poprzednim przykładzie, należy je zainicjować po definicji klasy, z zastrzeżeniem, że słowo kluczowe static musi zostać pominięte
(ii) const-static zmienne składowe klasy jest to proste i zgodne z konwencją inicjalizacji innych zmiennych const składowych, tzn. stałe zmienne składowe const klasy mogą być inicjalizowane w punkcie deklaracji i mogą być inicjalizowane na końcu deklaracji klasy z jednym zastrzeżeniem, że słowo kluczowe const musi zostać dodane do elementu statycznego podczas inicjalizacji po definicji klasy.
Poleciłbym jednak zainicjować stałe statyczne zmienne składowe w punkcie deklaracji. Jest to zgodne ze standardową konwencją C ++ i sprawia, że kod wygląda na czystszy
Aby uzyskać więcej przykładów statycznych zmiennych składowych w klasie, wyszukaj następujący link z learncpp.com http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
2. Słowo kluczowe „static” dla funkcji składowej klas
Podobnie jak zmienne składowe klas mogą być statyczne, podobnie jak składowe funkcje klas. Normalne funkcje składowe klas są zawsze powiązane z obiektem typu klasy. Natomiast statyczne funkcje składowe klasy nie są powiązane z żadnym obiektem klasy, tj. Nie mają * tego wskaźnika.
Po drugie, ponieważ statyczne funkcje składowe klasy nie mają * tego wskaźnika, można je wywoływać, używając nazwy klasy i operatora rozpoznawania zakresu w funkcji głównej (ClassName :: functionName ();)
Po trzecie, statyczne funkcje składowe klasy mogą uzyskiwać dostęp tylko do statycznych zmiennych składowych klasy, ponieważ niestatyczne zmienne składowe klasy muszą należeć do obiektu klasy.
Aby uzyskać więcej przykładów statycznych funkcji składowych w klasie, wyszukaj poniższy link z learncpp.com
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
źródło
struct Foo{static const std::string name = "cpp";};
błąd,name
musi być zdefiniowany poza klasą; ze zmiennymi wbudowanymi wprowadzonymi w c ++ 17 można kodować:struct Foo{static inline const std::string name = "cpp";};
2) Publiczne statyczne funkcjeTo jest właściwie dość proste. Jeśli zadeklarujesz zmienną jako statyczną w zakresie funkcji, jej wartość zostanie zachowana między kolejnymi wywołaniami tej funkcji. Więc:
pokaże
678
zamiast666
, ponieważ pamięta zwiększoną wartość.Jeśli chodzi o elementy statyczne, zachowują swoją wartość we wszystkich instancjach klasy. Więc następujący kod:
wypisze 4, ponieważ first.a i second.a są zasadniczo tą samą zmienną. Jeśli chodzi o inicjalizację, zobacz to pytanie.
źródło
Kiedy deklarujesz
static
zmienną w zakresie pliku, wówczas ta zmienna jest dostępna tylko w tym konkretnym pliku (technicznie * jednostka tłumacząca, ale nie komplikujmy tego zbytnio). Na przykład:a.cpp
b.cpp
main.cpp:
W przypadku zmiennej lokalnej
static
oznacza, że zmienna zostanie zainicjowana zerem i zachowa swoją wartość między wywołaniami:W przypadku zmiennych klasowych oznacza to, że istnieje tylko jedno wystąpienie tej zmiennej, które jest współużytkowane przez wszystkich członków tej klasy. W zależności od uprawnień do zmiennej można uzyskać dostęp spoza klasy przy użyciu jej w pełni kwalifikowanej nazwy.
Oznaczenie funkcji nieklasowej jako
static
nieklasowej powoduje, że funkcja jest dostępna tylko z tego pliku i niedostępna z innych plików.a.cpp
b.cpp
W przypadku funkcji składowych klasy oznaczenie ich jako
static
oznacza, że funkcja nie musi być wywoływana w konkretnej instancji obiektu (tzn. Nie mathis
wskaźnika).źródło
Zmienne statyczne są wspólne dla każdej instancji klasy, zamiast każdej klasy mającej własną zmienną.
Każde wystąpienie „MyClass” ma swój własny „myVar”, ale ma ten sam „myStaticVar”. W rzeczywistości nie potrzebujesz nawet instancji MyClass, aby uzyskać dostęp do „myStaticVar”, i możesz uzyskać do niej dostęp poza klasą w następujący sposób:
W przypadku użycia wewnątrz funkcji jako zmiennej lokalnej (a nie jako zmiennej składowej klasy) słowo kluczowe static robi coś innego. Umożliwia tworzenie trwałych zmiennych bez podawania globalnego zasięgu.
Jest to zmienna globalna pod względem trwałości ... ale bez globalnego zasięgu / dostępności.
Możesz także mieć statyczne funkcje składowe. Funkcje statyczne są w zasadzie funkcjami nie będącymi członkami, ale znajdują się w przestrzeni nazw nazwy klasy i mają prywatny dostęp do członków klasy.
Kiedy wywołujesz funkcję członka, pojawia się ukryty parametr o nazwie „this”, który jest wskaźnikiem do instancji klasy wywołującej funkcję. Statyczne funkcje składowe nie mają tego ukrytego parametru ... można je wywoływać bez instancji klasy, ale także nie mogą uzyskać dostępu do niestatycznych zmiennych składowych klasy, ponieważ nie mają wskaźnika „ten” do pracy. Nie są wywoływane w żadnej konkretnej instancji klasy.
źródło
myStaticVar
należy również zdefiniować. Warto wspomnieć, że odpowiadając na pytanie dotyczące semantykistatic
słowa kluczowego, nie sądzisz?Nie jestem programistą w języku C, więc nie mogę podać ci informacji na temat używania statycznego w programie w języku C, ale jeśli chodzi o programowanie obiektowe, statycznie deklaruje zmienną, funkcję lub klasę jako takie same przez cały czas trwania programu. Weź na przykład.
Kiedy tworzysz tę klasę w swoim Main, robisz coś takiego.
Te dwie instancje klasy są całkowicie różne i działają niezależnie od siebie. Ale jeśli miałbyś odtworzyć klasę A w ten sposób.
Wróćmy ponownie do głównego.
Wtedy a1 i a2 będą dzielić tę samą kopię int x, dzięki czemu wszelkie operacje na x w a1 będą miały bezpośredni wpływ na operacje x w a2. Więc gdybym to zrobił
Oba wystąpienia klasy A współużytkują zmienne statyczne i funkcje. Mam nadzieję, że to odpowiada na twoje pytanie. Moja ograniczona znajomość C pozwala mi powiedzieć, że zdefiniowanie funkcji lub zmiennej jako statycznej oznacza, że jest widoczne tylko dla pliku, w którym funkcja lub zmienna jest zdefiniowana jako statyczna. Ale lepiej by to udzielił facet C, a nie ja. C ++ umożliwia zarówno deklarowanie zmiennych C, jak i C ++ jako statyczne, ponieważ jest całkowicie wstecznie kompatybilny z C.
źródło
Tak - nieglobalny, taki jak zmienna lokalna funkcji.
Dobrze.
to znaczy wszystkie przypadki
R
udostępnianiaint R::a
-int R::a
nigdy nie są kopiowane.Skutecznie globalny, który ma konstruktor / destruktor tam, gdzie to właściwe - inicjalizacja nie jest odraczana do czasu dostępu.
W przypadku funkcji lokalnej jest ona zewnętrzna. Dostęp: jest dostępny dla funkcji (chyba, że ją zwrócisz).
W przypadku klasy jest ona zewnętrzna. Dostęp: zastosowanie mają standardowe specyfikatory dostępu (publiczne, chronione, prywatne).
static
może również określać wewnętrzne powiązanie, w zależności od tego, gdzie zostało zadeklarowane (plik / przestrzeń nazw).Ma zbyt wiele celów w C ++.
Jest automatycznie inicjowany wcześniej,
main
jeśli jest załadowany i ma konstruktor. Może to zabrzmieć dobrze, ale kolejność inicjalizacji jest w dużej mierze poza twoją kontrolą, więc złożona inicjalizacja staje się bardzo trudna do utrzymania i chcesz ją zminimalizować - jeśli musisz mieć statyczny, to lepiej działaj w lokalnych skalach w bibliotekach i projektowanie. Jeśli chodzi o dane ze statycznym czasem przechowywania, powinieneś spróbować zminimalizować ten projekt, szczególnie jeśli jest zmienny (zmienne globalne). „Czas” inicjalizacji jest również różny z wielu powodów - moduł ładujący i jądro mają pewne sztuczki, aby zminimalizować zużycie pamięci i opóźnić inicjalizację, w zależności od danych.źródło
Obiekt statyczny: Możemy zdefiniować członków klasy statycznych za pomocą słowa kluczowego static. Kiedy deklarujemy członka klasy jako statyczny, oznacza to, bez względu na to, ile obiektów klasy zostanie utworzonych, istnieje tylko jedna kopia tego członka.
Element statyczny jest wspólny dla wszystkich obiektów klasy. Wszystkie dane statyczne są inicjowane do zera podczas tworzenia pierwszego obiektu, jeśli nie ma innej inicjalizacji. Nie możemy umieścić go w definicji klasy, ale można ją zainicjować poza klasą, jak to pokazano w poniższym przykładzie, poprzez ponowne ustawienie zmiennej statycznej, używając operatora rozdzielczości zakresu :: w celu określenia, do której klasy należy.
Spróbujmy następującego przykładu, aby zrozumieć pojęcie statycznych elementów danych:
Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:
Statyczne elementy funkcji: Deklarując element funkcji jako statyczny, uniezależniasz go od dowolnego określonego obiektu klasy. Statyczną funkcję składową można wywołać, nawet jeśli nie istnieją żadne obiekty klasy, a do funkcji statycznych można uzyskać dostęp tylko przy użyciu nazwy klasy i operatora rozpoznawania zasięgu ::.
Funkcja członka statycznego może uzyskiwać dostęp tylko do elementu danych statycznych, innych funkcji członka statycznego i wszelkich innych funkcji spoza klasy.
Statyczne funkcje składowe mają zasięg klasy i nie mają dostępu do tego wskaźnika klasy. Możesz użyć funkcji członka statycznego, aby ustalić, czy niektóre obiekty klasy zostały utworzone, czy nie.
Spróbujmy następującego przykładu, aby zrozumieć pojęcie elementów funkcji statycznej:
Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:
źródło