CV oznacza stał. Deklaracja obiektu, która nie jest poprzedzona stałą i/lub lotną, jest typem bezkwalifikowanym CV. Z drugiej strony deklaracja obiektu poprzedzona stałą i/lub lotną jest typem kwalifikowanym przez CV. Jeśli obiekt jest zadeklarowany, stał się, wartości w jego lokalizacji nie można zmienić. Zmienna lotna jest zmienną, której wartość jest pod wpływem programisty, a zatem nie może być zmieniana przez kompilator.Specyfikatory klas przechowywania odnoszą się do życia, miejsca i sposobu, w jaki istnieje typ. Specyfikatory klas przechowywania są statyczne, zmienne, Thread_Local i Extern.
W tym artykule wyjaśniono kwalifikatory C ++ i specyfikatory klas przechowywania. Zatem pewna wstępna wiedza w C ++ przydaje się, aby naprawdę docenić ten artykuł.
Treść artykułu:
Kwalifikacje:
const
Obiekt zadeklarowany stała jest obiektem przechowywania (lokalizacji), którego wartości nie można zmienić. Na przykład w stwierdzeniu:
int const theint = 5;Wartości 5 w pamięci masowej dla tegot nie można zmienić.
lotny
Rozważ następujące stwierdzenie:
int portval = 26904873;Kompilatory czasami zakłócają wartość zmiennej z nadzieją na zoptymalizowanie programu. Kompilator może utrzymać wartość zmiennej jako stałej, gdy nie powinna być stała. Wartości obiektów, które mają związek z mapowanymi pamięcią porty IO lub procedurami usługi przerywania urządzeń peryferyjnych, mogą być zakłócone przez kompilator. Aby zapobiec takim zakłóceniu, spraw, aby zmienna zmienna, na przykład:
Int lotny portval;Łączenie stałej i niestabilnej:
Const i niestabilne mogą wystąpić w jednym stwierdzeniu w następujący sposób:
int const lotny portu = 26904873;CV-kwalifikatory
Zmienna poprzedzona const i/lub lotną jest typ kwalifikowanym przez CV. Zmienna nie poprzedzona ani stałą, albo oba lub oba to typ bezkwalifikowany przez CV.
Zamawianie:
Jeden typ może być bardziej kwalifikowany CV niż inny:
Nie zostało jeszcze zakończone, jeśli const i niestabilne są tej samej rangi.
Tablica i instanowany obiekt:
Gdy tablica jest zadeklarowana stała, jak w poniższym stwierdzeniu, oznacza to, że nie można zmienić wartości każdego elementu tablicy:
const char arr [] = „a”, „b”, „c”, 'd';Niezależnie od tego, czy jest to „A”, „B”, „C”, czy „D”, nadal nie można go zmienić na inną wartość (charakter).
Podobna sytuacja dotyczy inferencji. Rozważ następujący program:
#włączaćZ powodu stwierdzenia „const cla obj;” Z funkcją Main (), ani „A”, ani „B”, ani „C”, ani „D” nie mogą zostać zmienione na inną wartość.
Specyfikatory klasy przechowywania:
Specyfikatory klas przechowywania są statyczne, zmienne, Thread_Local i Extern.
Specyfikator klasy statycznej
Specyfikator klasy statycznej przechowywania umożliwia przeżycie zmiennej po przejściu jej zakresu, ale nie można uzyskać do niego dostępu bezpośrednio.
Poniższy program ilustruje to z funkcją rekurencyjną:
#włączaćWyjście to:
10 20 30 40 50Jeśli zmienna statyczna nie jest inicjowana przy pierwszej deklaracji, przyjmuje wartość domyślną dla jej typu.
Specyfikator statyczny może być również używany z członkami klasy; Zastosowanie tutaj jest inne. Tutaj umożliwia dostęp do członka bez instancji obiektu.
Poniższy program ilustruje to dla członka danych:
#włączaćWyjście to:
8Statyczny element danych musi być stały. Należy zauważyć, że użycie operatora rozdzielczości zakresu w celu uzyskania dostępu do zmiennej statycznej poza jej zakresem (w głównej funkcji).
Poniższy program ilustruje użycie „statycznego” dla funkcji członka:
#włączaćWyjście to:
Statycznej funkcji członka!
Należy zauważyć, że użycie operatora rozdzielczości zakresu w celu uzyskania dostępu do funkcji elementu statycznego poza jej zakresem (w funkcji głównej).
Zmieniony specyfikator
Pamiętaj, że z góry, że jeśli instanowany obiekt rozpocznie się od Const, wartość dowolnego z jego normalnych elementów danych nie może zostać zmieniona. I aby każdy taki element danych został zmieniony, należy je zadeklarować, zmienne.
Poniższy program ilustruje to:
#włączaćWyjście to:
„A„ B ”Z” D 'Specyfikator Thread_Local
W normalnym uruchomieniu programu wykonuje się jeden segment kodu, a następnie następny segment kodu, a następnie kolejny segment kodu. To jest jeden wątek; główny wątek. Jeśli dwa segmenty kodu wykonają jednocześnie (ten sam czas trwania), potrzebny jest drugi wątek. Wynik drugiego wątku może być nawet gotowy przed głównym wątkiem.
Funkcja main () jest jak główny wątek. Program może mieć więcej niż dwa wątki dla takiego asynchronicznego zachowania.
Drugi wątek potrzebuje zakresu (zakresu blokowego) w celu obsługi. Zazwyczaj jest to zapewniane przez zakres funkcji, funkcja. Zmienna w zewnętrznym zakresie, który można zobaczyć w zakresie drugiego wątku.
Poniższy krótki program ilustruje użycie specyfikatora Thread_Local:
#włączaćWyjście to:
1. lub główny wątekZmienna, inter, poprzedzona przez Thread_Local, oznacza, że internowanie ma osobną instancję w każdym wątku. I że można go zmodyfikować w różnych wątkach, aby mieć różne wartości. W tym programie przypisuje się wartość 1 w głównym wątku i modyfikowana do wartości, 2 w drugim wątku.
Wątek potrzebuje specjalnego obiektu w celu obsługi. W przypadku tego programu biblioteka zawarta przez „#Include” ma klasę o nazwie wątek, z którego obiekt Thr został utworzony. Konstruktor tego obiektu odwołuje się do funkcji wątku jako argument. Nazwa funkcji wątku w tym programie to Thread_Function ().
Funkcja członka Join () dla obiektu specjalnego, na jego zastosowanym stanowisku, sprawia, że główny wątek czeka, aż drugi wątek zakończy wykonywanie, zanim będzie kontynuowana, w przeciwnym razie funkcja main () może wyjść bez (drugiego) wątku dał swój wynik.
Specyfikator zewnętrzny
Mówiąc prosto, dla deklaracji pamięć nie jest przydzielana dla zmiennej lub funkcji, podczas gdy dla definicji pamięć jest przydzielana. Zastrzeżone słowo zewnętrzne umożliwia deklarowanie zmiennej globalnej lub funkcji w jednym pliku, ale zdefiniowanym w innym. Takie pliki nazywane są jednostkami tłumaczeniowymi dla kompletnej aplikacji C ++.
Wpisz następujący program i zapisz go z nazwą pliku, Mainfile:
#włączaćZmienna, myint, stała zmienna, CH i funkcja, myfn (), zostały zadeklarowane bez zdefiniowania.
Wpisz następujący program z definicjami i zapisz go za pomocą nazwy pliku, w innym pliku, w tym samym katalogu:
#włączaćSpróbuj skompilować aplikację na terminalu (wiersz polecenia DOS) za pomocą następującego polecenia i zauważ, że nie może ono kompilacji:
G ++ Mainfile.CPP INTERFILE.cpp -o kompletne.exeTeraz poprzedzaj trzy deklaracje w Mainfile ze słowem „zewnętrznym”, w następujący sposób:
extern int myint;Ponownie zapisz Mainfile. Skompiluj aplikację z:
G ++ Mainfile.CPP INTERFILE.cpp -o kompletne.exe(W ten sposób oddzielne pliki dla tej samej aplikacji są kompilowane w C ++)
I powinien się skompilować. Teraz uruchom aplikację, zakończ.exe, a wyjście powinno być:
myfn () mówi 10 i cZauważ, że przy użyciu „zewnętrznego” zmienna stała może być zadeklarowana w jednym pliku, ale zdefiniowana w innym. W ramach deklaracji funkcji i definicji w różnych plikach użycie Extree jest opcjonalne.
Kiedy używać zewnętrznego? Używaj go, gdy nie masz plików nagłówka z globalnymi deklaracją.
„EXTRIC” jest również używany z deklaracji szablonów - patrz później.
Wniosek:
Zmienna poprzedzona const i/lub lotną jest typ kwalifikowanym przez CV. Zmienna, nie poprzedzona ani stałą, albo oba, jest typem niewidocznym CV.
Specyfikatory klas przechowywania są statyczne, zmienne, Thread_Local i Extern. Wpływają one na żywotność (czas trwania), miejsce i sposób zatrudnienia zmiennych w aplikacji.