C++

Typy C++

Typy C++
Jednostka C++ to wartość, obiekt, odwołanie, funkcja, moduł wyliczający, typ, element członkowski klasy, pole bitowe, powiązanie strukturalne, przestrzeń nazw, szablon, specjalizacja szablonu lub pakiet parametrów. Jednostka może być jednego lub więcej typów. Istnieją dwie kategorie typów C++: typy podstawowe i złożone. Skalar to obiekt arytmetyczny lub wskaźnikowy. Typy podstawowe to skalary, podczas gdy pozostałe typy encji to typy złożone.

Pamięć komputera to szereg komórek. Każda komórka ma rozmiar jednego bajta, zwykle jest to miejsce zajmowane przez postać zachodnioeuropejską. Wielkość obiektu podawana jest w bajtach. Ten artykuł zawiera podsumowanie typów C++. Powinieneś już mieć podstawową wiedzę o C++, aby zrozumieć ten artykuł.

Treść artykułu

- Podstawowe typy
- Sposoby konstruowania typów złożonych
- Tablice
- Wyliczenie
- Klasa
- Unia
- Bibliografia
- Funkcje
- Inne typy mieszanek
- Wniosek

Podstawowe typy

Typy podstawowe to typy skalarne.

głupota

Typ Boolean lub typ bool ma wartość true lub false dla 1 lub 0. Prawda czy fałsz zajmuje jeden bajt.

char, unsigned char i podpisany char

Znak jest zazwyczaj dla jednej postaci zachodnioeuropejskiej. Zwykle zajmuje jeden bajt. Istnieje również znak bez znaku i ze znakiem, z których każdy jest ośmiobitową liczbą całkowitą. Znaki bez znaku nie zawierają wartości ujemnych, podczas gdy znaki ze znakiem zawierają wartości ujemne. Rodzaj wartości, którą przechowuje znak, zależy od kompilatora i może być po prostu znakiem bez znaku. Te trzy typy znaków są nazywane, wąskimi typami znaków, a każdy zajmuje jeden bajt.

Liczba całkowita

Istnieje pięć standardowych typów liczb całkowitych bez znaku i pięć standardowych typów liczb całkowitych ze znakiem. Pięć typów liczb całkowitych bez znaku to: „unsigned char”, „unsigned short int”, „unsigned int”, „unsigned long int” i „unsigned long long int”. Pięć odpowiadających typów liczb całkowitych ze znakiem to: „signed char”, „short int”, „int”, „long int” i „long long int”.

„unsigned char” to ten sam typ, co wąskie typy znaków (patrz wyżej). „signed char” to inny typ wąskich typów znaków (patrz wyżej).

W kompilatorze g++ „unsigned char” lub „signed char” zajmuje jeden bajt; „unsigned short int” lub „short int” zajmuje dwa bajty; „unsigned int” lub „int” zajmuje cztery bajty; „unsigned long int” lub „long int” zajmuje 8 bajtów; „unsigned long long int” lub „long long int” nadal zajmuje 8 bajtów (na razie).

char16_t, char32_t, char_t

W przypadku postaci zachodnioeuropejskich w wielu sytuacjach wystarczy typ char. Jednak w przypadku języka chińskiego i innych języków wschodnich potrzebny jest char16_t lub char32_t lub wchar_t. W kompilatorze g++ char16_t zajmuje dwa bajty; char32_t zajmuje cztery bajty, a wchar_t również zajmuje cztery bajty.

Typy bool, char, char16_t, char32_t, wchar_t, sign i unsigned integer tworzą inny zestaw, zwany typami całkowitymi (integer).

W tym miejscu w artykule wymieniono dwa typy zbiorowe: wąskie typy znakowe i typy integralne.

Typy zmiennoprzecinkowe

Załóżmy, że liczby 457 000 i 457 230 to ten sam odczyt, mierzony dwoma różnymi przyrządami pomiarowymi. 457 230 jest dokładniejsze niż 457 000, ponieważ wartość jest bardziej szczegółowa (obejmuje mniejsze miejsca: + 200 plus 30). Liczba zmiennoprzecinkowa to liczba z częścią ułamkową (dziesiętną). Chociaż liczby w komputerze są sekwencją bitów, niektóre liczby zmiennoprzecinkowe są bardziej precyzyjne niż inne.

Niektóre przyrządy pomiarowe wykonują pomiary w minimalnych krokach, powiedzmy 10 jednostek. Taki instrument miałby następujące odczyty: 10, 20, 30, 40,… 100, 110, 130, 140,… 200, 210, 220, 230, 240 i tak dalej. Chociaż liczby w komputerze są sekwencją bitów, liczby zmiennoprzecinkowe różnią się w pewnych minimalnych krokach (znacznie mniejszych niż 10 jednostek).

C++ ma trzy typy zmiennoprzecinkowe, którymi są: float, double i long double. Dla każdego kompilatora double musi mieć precyzję wyższą niż float lub przynajmniej float; długi duble musi mieć precyzję większą niż duble lub przynajmniej duble.

Istnieje trzecia nazwa zbiorowa: typ arytmetyczny. To jest nazwa typów całkowitych i zmiennoprzecinkowych. Zauważ, że jest to również nazwa dla wszystkich typów skalarnych, jak wyjaśniono do tej pory.

W kompilatorze g++ liczba bajtów liczby zmiennoprzecinkowej wynosi cztery; liczba bajtów dla podwójnego wynosi osiem; liczba bajtów długiego podwójnego wynosi szesnaście.

nieważny Typ

W kompilatorze g++ rozmiar typu void wynosi jeden bajt. Bajt oficjalnie nie zawiera bitów, co oznacza, że ​​jego lokalizacja ma pustą zawartość.

Sposoby konstruowania typów złożonych

Typy złożone nie są typami podstawowymi. Oznacza to, że typy złożone są typami nieskalarnymi. Ta sekcja wyjaśnia podstawy typów związków.

Tablice

Poniższy segment kodu pokazuje tablicę int i tablicę znaków:

int przylInt[] = 1, 2, 3, 4, 5;
char arrCha[] = 'a', 'b', 'c', 'd', 'e';
Cout << arrInt[2] <<" <Wyjście to: 3 c.

Wyliczenie

Wyliczenie to typ z nazwanymi stałymi. Rozważ następujący segment kodu:

wyliczenie a=3, b, c;
Cout << b <<'\n';

Wyjście to: 4. Pierwszy wiersz segmentu kodu to wyliczenie, a a, b lub c to enumerator.

Klasa

Klasa to uogólniona jednostka, z której można utworzyć wiele obiektów tej samej uogólnionej jednostki (instancja). Poniższy program pokazuje klasę i dwa obiekty utworzone z niej. Taki obiekt różni się od obiektu skalarnego.

#zawierać
przy użyciu standardowej przestrzeni nazw;
klasa TheCla

publiczny:
liczba int = 5;
int fn()

numer zwrotu;

;
int main()

TheCla obj1;
TheCla obj2;
Cout << obj1.num << " << obj2.num <<'\n';
zwróć 0;

Wyjście to: 5 5. Nazwa klasy to TheCla, a nazwy dwóch obiektów to obj1 i obj2. Zwróć uwagę na średnik tuż po opisie (definicji) klasy. Zwróć uwagę, jak te dwa obiekty zostały utworzone w funkcji main().

Uwaga: num to element danych, a fn to funkcja członka.

Unia

struktura

Struktura jest jak tablica, ale zamiast par indeks/wartość ma pary nazwa/wartość. Nazwiska mogą być pisane w dowolnej kolejności. Poniższy program pokazuje strukturę i jej zastosowanie:

#zawierać
przy użyciu standardowej przestrzeni nazw;
struct TheCla

liczba int = 5;
flt pływaka = 2.3;
znak ch = 'a';
obj1, obj2;
int main()

Cout << obj2.num <<", "<< obj2.flt <<", "<< obj2.ch <<'\n';
zwróć 0;

Dane wyjściowe to:

5, 2.3, a

Nazwa struktury to TheCla. obj1 i obj2 to dwa różne obiekty struct.

Unia

Poniższy program pokazuje związek i jego zastosowanie:

#zawierać
przy użyciu standardowej przestrzeni nazw;
związek TheCla

liczba wewnętrzna;
flt pływaka = 2.3;
char ch;
obj1, obj2;
int main()

Cout << obj2.flt <<'\n';
zwróć 0;

Wyjście to: 2.3. Związek jest podobny do struct. Główna różnica między strukturą a unią polega na tym, że w przypadku struktury tylko jeden element członkowski może mieć wartość (zainicjowaną) w dowolnym momencie. W powyższym programie element flt ma wartość 2.3. Każdy z pozostałych elementów, num lub ch, może mieć wartość następną tylko wtedy, gdy wartość flt zostanie porzucona.

Bibliografia

Odwołanie jest synonimem identyfikatora. Poniższy segment kodu pokazuje, jak uzyskać odwołanie do identyfikatora:

int id = 5;
int& ref1 = id;
int& ref2 = id;
Cout << id << " << ref1 << " << ref2 <<'\n';

Wyjście to: 5 5 5. ref1 i ref2 są synonimami id.

lwartość Odniesienie i rwartość Odniesienie

Powyższe referencje są referencjami do lwartości. Poniższy kod pokazuje odwołanie do rvalue:

int&& ref = 5;
Cout << ref <<'\n';

Wyjście to: 5. To odniesienie jest tworzone bez identyfikowania jakiejkolwiek lokalizacji w pamięci. Aby to osiągnąć, potrzebne jest podwójne &, i.mi., &&.

Wskaźnik

Wskaźnik nie jest tak naprawdę jednostką C++. Zapewnia jednak lepszy schemat postępowania z referencjami. Poniższy kod pokazuje, jak można utworzyć wskaźnik:

int ptdId = 5;
int ptdId = 5;
int *ptrId;
pktId = &ptdId;
Cout << *ptrId <<'\n';

Wyjście to: 5. Zwróć uwagę na różnicę w nazwie między ptdId i ptdId. ptdId jest wskazanym obiektem, a ptrId jest obiektem wskaźnika. &ptdId zwraca adres wskazanego obiektu, który jest przypisany do ptrId. Aby zwrócić wartość wskazanego obiektu, użyj *ptrId.

Funkcje

Podstawowa funkcja i jej wywołanie

Poniższy kod przedstawia podstawową definicję funkcji i jej wywołanie:

#zawierać
przy użyciu standardowej przestrzeni nazw;
int fn(liczba int)

Cout<<"seen"<<'\n';
numer zwrotu;

int main()

int ret = fn(5);
Cout << ret <<'\n';
zwróć 0;

Wyjście to

definicja funkcji

5

Wywołanie funkcji to fn(5). Nazwa funkcji to fn.

Odniesienie i wskaźnik do funkcji

&fn zwraca adres w pamięci funkcji o nazwie fn. Poniższa instrukcja deklaruje wskaźnik do funkcji:

int (*funkcja)();

Tutaj func jest nazwą wskaźnika do funkcji. Pierwsza para nawiasów odróżnia ten wskaźnik do funkcji od wskaźnika do obiektu skalarnego. func może być zmuszona do przechowywania adresu funkcji zidentyfikowanej przez fn w następujący sposób:

funkcja = &fn;

Poniższy program uruchamia odwołanie do funkcji i wskaźnik:

#zawierać
przy użyciu standardowej przestrzeni nazw;
int fn(liczba int)

/* niektóre stwierdzenia */
numer zwrotu;

int main()

int (*funkcja)(int);
funkcja = &fn;
int ret = func(5);
Cout << ret <<'\n';
zwróć 0;

Wyjście to: 5. Zwróć uwagę, że zarówno fn, jak i func mają w deklaracji parametr int.

Inne typy mieszanek

Powyższe podstawowe typy związków są same w sobie złożone. Służą również do konstruowania rozbudowanych typów złożonych.

typedef

Zarezerwowane słowo typedef służy do zastąpienia sekwencji typów jedną nazwą (dla sekwencji). Poniższy segment kodu ilustruje to:

typedef unsigned long int IduIL;

IduIL mojeInt = 555555555555555555;
Cout << myInt <<'\n';

Wyjście to 555555555555555555. W kodzie IduIL stał się typem oznaczającym „unsigned long int”.

Wiązanie strukturalne

Wiązanie strukturalne to funkcja, która umożliwia nadawanie nazw podobiektom. Poniższy kod ilustruje to dla tablicy:

int arr[3] = 1, 2, 3;
auto [x, y, z](arr);
Cout << x <<"<< y <<"<< z <<'\n';

Wyjście to 1 2 3. Tak więc wartościom: 1, 2, 3 nadano nazwy x, y, z. Zwróć uwagę na użycie i pozycję słowa zastrzeżonego, auto. Zwróć także uwagę na użycie nawiasów kwadratowych.

Pole bitowe

Pamięć to sekwencja komórek. Każda komórka zajmuje bajt. Ponadto każdy bajt składa się z ośmiu bitów. Można ustawić i zmienić grupę bitów, niekoniecznie osiem bitów. Taka grupa nazywa się polem bitowym. Te grupy leżałyby obok siebie. Jeśli grupy nie utworzą typu, powiedzmy 16 bitów na krótki int, dodawane są bity dopełniające. Poniższy kod ilustruje to za pomocą struktury:

struktura Data

unsigned short wkDay : 3; //3 bity
krótki bez znaku poniedziałek : 6; //6 bitów
unsigned short pon : 5; //5 bitów
niepodpisany krótki rok : 8; //8 bitów dla 2-cyfrowego roku
dt;
dte.dzień tygodnia = 1; dte.poniedziałek = 2; dte.pon = 2; dte.rok = 21;
Cout << dte.mon <<'/'<< dte.monDay <<'/'<< dte.yr <<'\n';

Wyjście to: 2/2/21. Całkowita liczba bitów dla wkDay, MonDay i mon wynosi 3 + 6 + 5 = 14. Tak więc zostaną dodane dwa bity dopełniające, aby utworzyć 16 bitów dla krótkiej liczby całkowitej wynoszącej 2 bajty (16 bitów). Następne 8 bitów rozpoczyna następny krótki int, który jest następnie wypełniany 8 bitami dopełniającymi.

Uwaga: Unikaj używania pól bitowych; używaj go tylko do badań.

Przestrzeń nazw

Przestrzeń nazw to zestaw nazw, który nie powinien kolidować z tymi samymi nazwami innych zestawów nazw. Poniższy program ilustruje użycie tych samych nazw z dwóch różnych przestrzeni nazw, zastosowanych w przestrzeni nazw funkcji main():

#zawierać
przy użyciu standardowej przestrzeni nazw;
przestrzeń nazw NS1

int mojeInt = 8;
pływak flt;

przestrzeń nazw NS2

int mojeInt = 9;
pływak flt;

int main()

Cout << NS1::myInt << '\n';
Cout << NS2::myInt << '\n';
NS1::flt = 2.5;
NS2::flt = 4.8;
Cout << NS1::flt << '\n';
Cout << NS2::flt << '\n';
zwróć 0;

Dane wyjściowe to:

9

8

2.5

4.8

W kodzie występują dwie takie same nazwy int i dwie takie same nazwy zmiennoprzecinkowe.

Szablon i specjalizacja szablonów

Schemat szablonu pozwala na użycie symbolu zastępczego dla różnych możliwych typów skalarnych. Specjalizacja to wybór konkretnego typu skalarnego. Poniższy kod ilustruje to dla funkcji:

#zawierać
przy użyciu standardowej przestrzeni nazw;
szablon void func (T cha, U no)

Cout << "I need bread for " << cha << no << '.' << '\n';

int main()

func('$', 3);
zwróć 0;

Dane wyjściowe to:

“Potrzebuję chleba za 3 dolary.”

Pakiet parametrów szablonu

Kompilatory wciąż mają w pełni zaimplementować tę funkcję - zobacz później.

Wniosek

Typy C++ istnieją w dwóch kategoriach: typy podstawowe i typy złożone. Typy podstawowe to typy skalarne. Podstawowe typy złożone to tablice, wyliczenia, klasy, związki, referencje, wskaźniki i funkcje. Te podstawowe typy złożone są używane do konstruowania złożonych typów złożonych, którymi są typedef, strukturalne wiązania, pola bitowe, przestrzeń nazw i funkcje szablonów.

Chrys

Gry Jak stworzyć grę na Linuksie
Jak stworzyć grę na Linuksie
Dziesięć lat temu niewielu użytkowników Linuksa przewidywało, że ich ulubiony system operacyjny pewnego dnia stanie się popularną platformą do gier dl...
Gry Open Source Ports of Commercial Game Engines
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...
Gry Najlepsze gry wiersza poleceń dla systemu Linux
Najlepsze gry wiersza poleceń dla systemu Linux
Wiersz poleceń jest nie tylko twoim największym sprzymierzeńcem podczas korzystania z Linuksa - może być również źródłem rozrywki, ponieważ możesz go ...