C ++

C ++ typer

C ++ typer
En C ++ -enhed er en værdi, objekt, reference, funktion, enumerator, type, klassemedlem, bitfelt, struktureret binding, navneområde, skabelon, skabelonspecialisering eller parameterpakke. En enhed kan være af en eller flere typer. Der er to kategorier af C ++ typer: grundlæggende og sammensatte typer. En skalar er aritmetik eller en pointerobjektype. Grundlæggende typer er skalarer, mens resten af ​​enhedstyperne er sammensatte typer.

Hukommelsen på en computer er en række celler. Hver celle har størrelsen på en byte, det er normalt det rum, der er besat af en vesteuropæisk karakter. Størrelsen på et objekt er angivet i byte. Denne artikel giver et resumé af C ++ - typer. Du bør allerede have grundlæggende viden om C ++ for at forstå denne artikel.

Artikelindhold

- Grundlæggende typer
- Måder at konstruere sammensatte typer
- Arrays
- Optælling
- Klasse
- Union
- Referencer
- Funktioner
- Andre sammensatte typer
- Konklusion

Grundlæggende typer

Grundlæggende typer er skalartyper.

bool

En boolsk type eller bool-type har værdien sand eller falsk for 1 eller 0. Sandt eller falsk optager en byte.

char, usigneret char og signeret char

En char er typisk for en vesteuropæisk karakter. Det optager typisk en byte. Der er også en usigneret og underskrevet char, som hver er et otte-bit heltal. Usignerede tegn involverer ikke negative værdier, mens underskrevne tegn involverer negative værdier. Hvilken værdi en char har, afhænger af compileren og kan bare være en usigneret char. Disse tre typer af tegn kaldes, smalle karaktertyper, og hver indtager en byte.

Heltal

Der er fem usignerede standard heltalstyper og fem underskrevne standard heltalstyper. De fem usignerede heltalstyper er: "usigneret char", "usigneret kort int", "usigneret int", "usigneret lang int" og "usigneret lang int int". De fem tilsvarende signerede heltalstyper er: "signeret char", "short int", "int", "long int" og "long long int".

"Usigneret char" er den samme type som de smalle tegntyper (se ovenfor). "Signeret char" er den anden type af de smalle karaktertyper (se ovenfor).

Med g ++ -kompileren optager "usigneret char" eller "signeret char" en byte; "Usigneret kort int" eller "kort int" optager to bytes; "Usigneret int" eller "int" optager fire byte; “Unsigned long int” eller “long int” optager 8 bytes; "Usigneret lang lang int" eller "lang lang int" optager stadig 8 byte (pr. Nu).

char16_t, char32_t, wchar_t

Når man beskæftiger sig med vesteuropæiske tegn, er char-typen tilstrækkelig i mange situationer. Men når man beskæftiger sig med kinesisk og andre østlige sprog, er der brug for char16_t eller char32_t eller wchar_t. Med g ++ -kompileren optager char16_t to bytes; char32_t optager fire byte, og wchar_t optager også fire byte.

Bool, char, char16_t, char32_t, wchar_t, den underskrevne og de usignerede heltalstyper danner et andet sæt, kaldet integrale (heltal) typer.

På dette tidspunkt i artiklen er to kollektive typer blevet nævnt: smalle karaktertyper og integrerede typer.

Flydende punkttyper

Antag, at tallene 457.000 og 457.230 er den samme måling målt ved hjælp af to forskellige måleinstrumenter. 457,230 er mere præcis end 457,000, fordi værdien er mere detaljeret (involverer mindre steder: + 200 plus 30). Et flydende tal er et tal med en brøkdel (decimal) del. Selvom tal i computeren er en sekvens af bits, er nogle flydende numre mere præcise end de andre.

Nogle måleinstrumenter tager målinger i mindst trin, siger 10 enheder. Et sådant instrument ville have følgende aflæsninger: 10, 20, 30, 40,… 100, 110, 130, 140,… 200, 210, 220, 230, 240 osv. Selvom tal i computeren er en sekvens af bits, varierer flydende numre i nogle minimale trin (meget mindre end 10 enheder).

C ++ har tre flydende punkttyper, som er: float, dobbelt og langt dobbelt. For enhver kompilator skal dobbelt have den nøjagtighed, der er højere end float eller mindst float; lang dobbelt skal have den nøjagtighed, der er højere end dobbelt eller mindst dobbelt.

Der er et tredje kollektivt navn: aritmetisk type. Dette er navnet på integrerede og flydende punkttyper. Bemærk, at dette også er navnet på alle skalartyper, som hidtil forklaret.

Med g ++ -kompilatoren er antallet af byte for en float fire; antallet af bytes for en dobbelt er otte; antallet af bytes for en lang dobbelt er seksten.

ugyldig Type

Med g ++ -kompilatoren er størrelsen på tomrumstypen en byte. Byten har officielt ingen bits, hvilket betyder, at dens placering har tomt indhold.

Måder at konstruere sammensatte typer

Forbindelsestyper er ikke-grundlæggende typer. Dette betyder, at sammensatte typer er ikke-skalære typer. Dette afsnit forklarer det grundlæggende i sammensatte typer.

Arrays

Følgende kodesegment viser en række ints og en række af tegn:

int arrInt [] = 1, 2, 3, 4, 5;
char arrCha [] = 'a', 'b', 'c', 'd', 'e';
cout << arrInt[2] <<" <Outputtet er: 3 c.

Optælling

En optælling er en type med navngivne konstanter. Overvej følgende kodesegment:

enum a = 3, b, c;
cout << b <<'\n';

Outputtet er: 4. Den første linje i kodesegmentet er en optælling, og a, b eller c er en tæller.

Klasse

En klasse er en generaliseret enhed, hvorfra mange objekter fra den samme generaliserede enhed kan oprettes (instantieres). Det følgende program viser en klasse og to objekter, instantieret ud fra den. Et sådant objekt er forskelligt fra et skalært objekt.

#omfatte
ved hjælp af namespace std;
klasse TheCla

offentlig:
int num = 5;
int fn ()

return num;

;
int main ()

TheCla mod1;
TheCla obj2;
cout << obj1.num << " << obj2.num <<'\n';
returnere 0;

Outputtet er: 5 5. Klassens navn er TheCla, og navnene på de to objekter er obj1 og obj2. Bemærk semikolon lige efter beskrivelsen (definition) af klassen. Bemærk, hvordan de to objekter blev instantieret i hovedfunktionen ().

Bemærk: num er et datamedlem og fn er en medlemsfunktion.

Union

struct

En struktur er som en matrix, men i stedet for at have indeks / værdipar har den navn / værdipar. Navnene kan skrives i en hvilken som helst rækkefølge. Følgende program viser en struktur og dens anvendelse:

#omfatte
ved hjælp af namespace std;
struct TheCla

int num = 5;
flyde flt = 2.3;
char ch = 'a';
obj1, obj2;
int main ()

cout << obj2.num <<", "<< obj2.flt <<", "<< obj2.ch <<'\n';
returnere 0;

Outputtet er:

5, 2.3, a

Navnet på strukturen er TheCla. obj1 og obj2 er to forskellige objekter af strukturen.

Union

Følgende program viser en fagforening og dens anvendelse:

#omfatte
ved hjælp af namespace std;
fagforening TheCla

int num;
flyde flt = 2.3;
char ch;
obj1, obj2;
int main ()

cout << obj2.flt <<'\n';
returnere 0;

Outputtet er: 2.3. Foreningen ligner en struktur. Hovedforskellen mellem en struct og en union er, at kun et medlem for en struct kan have en værdi (initialiseret) ad gangen. I ovenstående program har medlemmet flt en værdi på 2.3. Hvert af de andre medlemmer, num eller ch, kan kun have en værdi næste, hvis værdien for flt opgives.

Referencer

En reference er et synonym for en identifikator. Følgende kodesegment viser, hvordan man får en reference til en identifikator:

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

Outputtet er: 5 5 5. ref1 og ref2 er synonymer til id.

lvalue Reference og rvalue Reference

Ovenstående referencer er referencer til værdier. Følgende kode viser rværdireference:

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

Outputtet er: 5. Denne reference oprettes uden at identificere nogen placering i hukommelsen. For at opnå dette er dobbelt & nødvendigt, dvs.e., &&.

Markør

En markør er ikke rigtig en C ++ - enhed. Det giver dog en bedre ordning til håndtering af referencer. Følgende kode viser, hvordan en markør kan oprettes:

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

Outputtet er: 5. Bemærk forskellen i navn mellem ptdId og ptdId. ptdId er det spidse objekt og ptrId er markørobjektet. & ptdId returnerer adressen på det spidse objekt, der er tildelt ptrId. Brug * ptrId til at returnere værdien af ​​det spidse objekt.

Funktioner

Grundlæggende funktion og dens opkald

Følgende kode viser en grundlæggende funktionsdefinition og dens opkald:

#omfatte
ved hjælp af namespace std;
int fn (int num)

cout<<"seen"<<'\n';
return num;

int main ()

int ret = fn (5);
cout << ret <<'\n';
returnere 0;

Outputtet er

funktionsdefinition

5

Funktionsopkaldet er fn (5). Funktionens navn er fn.

Henvisning og markør til en funktion

& fn returnerer adressen i hukommelsen for den funktion, hvis navn er fn. Følgende erklæring erklærer en markør til en funktion:

int (* func) ();

Her er func navnet på markøren til funktionen. Det første par parentes skelner denne funktionsmarkør fra en skalar objektmarkør. funk kan fås til at holde adressen på en funktion identificeret ved fn, som følger:

func = &fn;

Følgende program omsætter funktionsreferencen og markøren til handling:

#omfatte
ved hjælp af namespace std;
int fn (int num)

/ * nogle udsagn * /
return num;

int main ()

int (* func) (int);
func = &fn;
int ret = func (5);
cout << ret <<'\n';
returnere 0;

Outputtet er: 5. Bemærk, at både fn og func hver har int-parameteren i erklæringen.

Andre sammensatte typer

Ovenstående basiske forbindelsestyper er sammensatte i sig selv. De bruges også til at konstruere udførlige sammensatte typer.

typedef

Det typedef reserverede ord bruges til at erstatte en sekvens af typer med et navn (for sekvensen). Følgende kodesegment illustrerer dette:

typedef usigneret lang int IdIL;

IduIL myInt = 555555555555555555;
cout << myInt <<'\n';

Outputtet er 555555555555555555. I koden er IduIL blevet en type, der står for "usigneret lang int".

Struktureret binding

Struktureret binding er en funktion, der gør det muligt for navne at blive givet til underobjekter. Følgende kode illustrerer dette for arrayet:

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

Outputtet er 1 2 3. Så værdierne: 1, 2, 3 har fået navnene x, y, z. Bemærk brugen og placeringen af ​​det reserverede ord, auto. Bemærk også brugen af ​​de firkantede parenteser.

Bit-felt

Hukommelsen er en sekvens af celler. Hver celle tager en byte. Hver byte består også af otte bits. En gruppe af bits, ikke nødvendigvis otte bits, kan indstilles og ændres. En sådan gruppe kaldes et bitfelt. Disse grupper ville ligge ved siden af ​​hinanden. Hvis grupperne ikke udgør en type, siger 16 bit for en kort int, tilføjes polstringsbit. Følgende kode illustrerer dette med strukturen:

struct Dato

usigneret kort wkDag: 3; // 3 bits
usigneret kort mandag: 6; // 6 bits
usigneret kort man: 5; // 5 bits
usigneret kort år: 8; // 8 bits til 2-cifret år
dte;
dte.wkDay = 1; dte.monDay = 2; dte.mon = 2; dte.yr = 21;
cout << dte.mon <<'/'<< dte.monDay <<'/'<< dte.yr <<'\n';

Outputtet er: 2/2/21. Det samlede antal bits for wkDay, MonDay og mon er 3 + 6 + 5 = 14. Så der tilføjes to polstringsbits for at udgøre 16 bits for det korte heltal på 2 byte (16 bits). De næste 8 bits begynder den næste korte int, som derefter udfyldes med 8 polstringsbits.

Bemærk: Undgå at bruge bitfelter; Brug det kun til forskning.

Navneområde

Et navneområde er et sæt navne, der ikke skal være i konflikt med de samme navne på andre sæt navne. Det følgende program illustrerer brugen af ​​de samme navne fra to forskellige navneområder, anvendt i hoved () -funktionens navneområde:

#omfatte
ved hjælp af namespace std;
navneområde NS1

int myInt = 8;
flyde flt;

navneområde NS2

int myInt = 9;
flyde 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';
returnere 0;

Outputtet er:

9

8

2.5

4.8

Der er to modstridende samme int-navne og to modstridende samme float-navne i koden.

Skabelon og skabelonspecialisering

Skabelonskemaet tillader brug af en pladsholder til forskellige mulige skalartyper. Specialisering er at vælge en bestemt skalartype. Følgende kode illustrerer dette for en funktion:

#omfatte
ved hjælp af namespace std;
skabelon ugyldig funktion (T cha, U no)

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

int main ()

func ('$', 3);
returnere 0;

Outputtet er:

”Jeg har brug for brød til $ 3.”

Skabelonparameterpakke

Compilere skal stadig implementere denne funktion fuldt ud - se senere.

Konklusion

C ++ typer findes i to kategorier: grundlæggende typer og sammensatte typer. Grundlæggende typer er skalartyper. Grundlæggende sammensatte typer er arrays, optællinger, klasser, fagforeninger, referencer, markører og funktioner. Disse grundlæggende sammensatte typer bruges til at konstruere udførlige sammensatte typer, som er typedef, strukturerede bindinger, bitfelter, navneområde og skabelonfunktioner.

Chrys

Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...
Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...