C ++

Kako uporabljati predloge C ++

Kako uporabljati predloge C ++

Uvod

V osnovnem programiranju C ++ je podatkovni tip, npr.g., int ali char, mora biti navedeno v izjavi ali definiciji. Vrednost, kot je 4 ali 22 ali -5, je int. Vrednost, kot je "A" ali "b" ali "c", je znak. Mehanizem predloge programerju omogoča, da za nabor dejanskih tipov uporabi generični tip. Na primer, programer se lahko odloči, da bo uporabil identifikator T za int ali char. Algoritem C ++ ima lahko več kot en generični tip. Recimo s T za int ali char, U lahko pomeni tip float ali kazalec. Razred, na primer niz ali vektorski razred, je podoben podatkovnemu tipu, instancirani predmeti pa so kot vrednosti podatkovnega tipa, ki je določen razred. Mehanizem predloge torej programerju omogoča tudi uporabo generičnega identifikatorja tipa za nabor razredov.

Predloga C ++ ustvari algoritem, neodvisen od vrste uporabljenih podatkov. Torej, isti algoritem z več pojavitvami istega tipa lahko pri različnih izvedbah uporablja različne tipe. Entitete spremenljivke, funkcije, strukture in razreda imajo lahko predloge. V tem članku je razloženo, kako prijaviti predloge, kako definirati predloge in kako jih uporabiti v jeziku C++. Že prej bi morali imeti znanje o zgoraj omenjenih entitetah, da bi razumeli teme, zajete v tem članku.

Vrste

Skalar

Tipi skalarja so void, bool, char, int, float in kazalec.

Razredi kot vrste

Določen razred lahko štejemo za tip in njegove predmete kot možne vrednosti.

Generični tip predstavlja nabor skalarnih tipov. Seznam skalarnih vrst je obsežen. Tip int ima na primer druge sorodne vrste, kot so kratki int, dolgi int itd. Generični tip lahko predstavlja tudi sklop razredov.

Spremenljiv

Primer izjave in definicije predloge je naslednji:

predloga
T pi = 3.14;

Pred nadaljevanjem upoštevajte, da se taka izjava ne more pojaviti v glavni () funkciji ali v poljubnem obsegu bloka. Prva vrstica je izjava o glavi predloge z generičnim imenom tipa, ki ga izbere programer. Naslednja vrstica je definicija identifikatorja pi, ki je generičnega tipa T. Natančnost, ali je T int ali float ali kak drug tip, je mogoče določiti v funkciji C ++ main () (ali kakšni drugi funkciji). Takšna natančnost bo narejena s spremenljivko pi in ne s T.

Prva vrstica je izjava o glavi predloge. Ta izjava se začne z rezervirano besedo, predlogo, nato pa z odprtimi in zaprtimi oklepaji. V kotnih oklepajih je zgoraj vsaj en splošni identifikator tipa, na primer T. Lahko je več kot en generični identifikator tipa, pred vsakim pa je rezervirana beseda, typename. Takšni generični tipi v tem položaju se imenujejo parametri predloge.

Naslednjo izjavo lahko zapišemo v main () ali katero koli drugo funkcijo:

cout << pi << '\n';

In funkcija bi prikazala 3.14. Izraz pi odloči natančen tip T za spremenljivko pi. Specializacija določi določen tip podatkov za parameter predloge. Instantizacija je v tem primeru notranji postopek ustvarjanja določene vrste, na primer float, v C ++. Ne zamenjajte primerov parametra predloge in primerka razreda. V temi predloge ima lahko veliko podatkovnih tipov eno generično ime tipa, medtem ko ima veliko razredov eno generično ime razreda. Vendar pa se generično ime razreda za razrede preprosto imenuje razred in ne kot ime razreda. Vrednost je tudi za podatkovni tip, kot je int, kot instancirani objekt za razred, kot je razred String.

Pri specializaciji se izbrani tip podatkov, na primer float, postavi v kotne oklepaje za spremenljivko. Če je v deklaraciji glave predloge več kot en parameter predloge, bo v izrazu specializacije ustrezno število podatkovnih vrst v istem vrstnem redu.

Pri specializaciji je tip znan kot argument predloge. Ne mešajte med tem in argumentom funkcije za klic funkcije.

Privzeta vrsta

Če na specializaciji ni podan noben tip, se predpostavlja privzeti tip. Torej, iz naslednjega izraza:

predloga
U pi = "ljubezen";
zaslon od:
cout << pi<> << '\n';

je "ljubezen" do stalnega kazalca na char. V izjavi upoštevajte, da je U = const char *. Kotni oklepaji bodo pri specializaciji prazni (vrsta ni navedena); dejanski tip se šteje za kazalec const na char, privzeti tip. Če bi bil na specializaciji potreben kakšen drug tip, bi bilo v kotnih oklepajih zapisano ime tipa. Če je pri specializaciji zaželen privzeti tip, ponovitev tipa v kotnih oklepajih ni obvezna, tj.e., kotni oklepaji lahko ostanejo prazni.

Opomba: privzeti tip je med specializacijo še vedno mogoče spremeniti z drugačnim tipom.

strukt

Naslednji primer prikazuje, kako je mogoče uporabiti parameter predloge s strukturo:

predloga strukturne dobe

T Janez = 11;
T Peter = 12;
T Marija = 13;
T veselje = 14;
;

To so starosti učencev v razredu (razredu). Prva vrstica je izjava o predlogi. Telo v oklepajih je dejanska definicija predloge. Starost je mogoče prikazati v glavni () funkciji z naslednjim:

Starost ocena7;
cout << grade7.John << " << grade7.Mary << '\n';

Izhod je: 11 13. Prva izjava tukaj opravi specializacijo. Upoštevajte, kako je bil narejen. Prav tako daje ime za objekt struct: grade7. Drugi stavek ima navadne izraze objektnih struktur. Struktura je kot razred. Tu je Ages kot ime razreda, medtem ko je grade7 predmet razreda (struct).

Če so nekatere starosti cela števila, druge pa floats, potem struktura potrebuje dva splošna parametra, kot sledi:

predloga strukturne dobe

T Janez = 11;
U Peter = 12.3;
T Marija = 13;
U radost = 14.6;
;

Ustrezna koda za funkcijo main () je naslednja:

Starost ocena7;
cout << grade7.John << " << grade7.Peter << '\n';

Izhod je: 11 12.3. Pri specializaciji mora vrstni red vrst (argumentov) ustrezati vrstnemu redu generičnih tipov v izjavi.

Izjavo predloge je mogoče ločiti od definicije, kot sledi:

predloga strukturne dobe

T Janez;
U Peter;
T Marija;
U veselje;
;
Starost ocena7 = 11, 12.3, 13, 14.6;

Prvi segment kode je zgolj deklaracija predloge (ni nalog). Drugi segment kode, ki je zgolj stavek, je definicija identifikatorja grade7. Na levi strani je izjava identifikatorja, ocena 7. Na desni strani je seznam inicializatorja, ki članom strukture dodeli ustrezne vrednosti. Drugi segment (stavek) lahko zapišemo v funkcijo main (), medtem ko prvi segment ostane zunaj funkcije main ().

Netipski

Primeri ne-podatkovnih tipov vključujejo vrste int, kazalec na objekt, kazalec na funkcijo in samodejne vrste. Obstajajo še druge vrste, ki jih ta članek ne obravnava. Netip je podoben nepopolnemu tipu, katerega vrednost je dana kasneje in je ni mogoče spremeniti. Kot parameter se začne z določenim netipom, čemur sledi identifikator. Vrednost identifikatorja je dana pozneje, pri specializaciji, in je ni mogoče več spremeniti (kot konstanta, katere vrednost je podana pozneje). Naslednji program to ponazarja:

#include
uporaba imenskega prostora std;
predloga strukturne dobe

T Janez = N;
U Peter = 12.3;
T Marija = N;
U radost = 14.6;
;
int main ()

Starost ocena7;
cout << grade7.John << " << grade7.Joy << '\n';
vrnitev 0;

Pri specializaciji je prva vrsta, int, v kotnih oklepajih več za formalnost, da se zagotovi, da število in vrstni red parametrov ustreza številu in vrstnemu redu vrst (argumenti). Vrednost N je bila podana pri specializaciji. Izhod je: 11 14.6.

Delna specializacija

Predpostavimo, da ima predloga štiri generične vrste in da sta med štirimi vrstami potrebni dve privzeti vrsti. To je mogoče doseči z uporabo konstrukcije delne specializacije, ki ne uporablja operaterja dodelitve. Konstrukt delne specializacije torej daje privzete vrednosti podskupini generičnih tipov. Vendar pa sta v shemi delne specializacije potrebna osnovni razred (struct) in delni razred specializacije (struct). Naslednji program to ponazarja za eno generično vrsto od dveh generičnih vrst:

#include
uporaba imenskega prostora std;
// osnovni razred predloge
predloga
strukturne dobe

;
// delna specializacija
predloga
strukturne dobe

T1 Janez = 11;
plovec Peter = 12.3;
T1 Marija = 13;
float Joy = 14.6;
;
int main ()

Starost ocena7;
cout << grade7.John << " << grade7.Joy << '\n';
vrnitev 0;

Določite deklaracijo osnovnega razreda in njegovo delno definicijo razreda. Deklaracija glave predloge osnovnega razreda ima vse potrebne splošne parametre. Deklaracija glave predloge razreda delne specializacije ima samo generični tip. V shemi je uporabljen dodaten nabor kotnih oklepajev, ki prihaja tik za imenom razreda v definiciji delne specializacije. Pravzaprav je to delna specializacija. Ima privzeti in neprivzeti tip, v vrstnem redu, zapisanem v osnovnem razredu. Upoštevajte, da lahko privzeti tip v funkciji main () še vedno dobite drug tip.

Ustrezna koda funkcije main () je lahko naslednja:

Starost ocena7;
cout << grade7.John << " << grade7.Joy << '\n';

Izhod je: 11 14.6.

Paket predlogov parametrov

Paket parametrov je parameter predloge, ki za ustrezne podatkovne tipe sprejme nič ali več splošnih tipov predlog. Parameter paketa parametrov se začne z rezerviranim imenom besede ali razredom besede. Sledijo tri pike in nato identifikator pakiranja. Naslednji program ponazarja, kako lahko paket paketov predlog uporabite s strukturo:

#include
uporaba imenskega prostora std;
predloga strukturne dobe

int Janez = 11;
plovec Peter = 12.3;
int Marija = 13;
float Joy = 14.6;
;
int main ()

Starost razred B;
cout << gradeB.John << " << gradeB.Mary << '\n';
Starost ocenaC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Starost ocenaD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Starost <> razred A; // kot privzeto
cout << gradeA.John << " << gradeA.Joy << '\n';
vrnitev 0;

Rezultat je:

11 13
12.3 14.6
11. 14.6
11. 14.6

Predloge funkcij

Zgoraj omenjene funkcije predloge veljajo na podoben način za predloge funkcij. Naslednji program prikazuje funkcijo z dvema splošnima parametroma predloge in tremi argumenti:

#include
uporaba imenskega prostora std;
predloga void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
vrnitev 0;

Rezultat je naslednji:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Ločitev od prototipa

Definicijo funkcije je mogoče ločiti od njenega prototipa, kot kaže naslednji program:

#include
uporaba imenskega prostora std;
predloga void func (T ne, U cha, const char * str);
predloga void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
vrnitev 0;

Opomba: Izjava o predlogi funkcije ne more biti prikazana v glavni () funkciji ali kateri koli drugi funkciji.

Preobremenitev

Preobremenitev iste funkcije lahko poteka z različnimi izjavami glave predloge. Naslednji program to ponazarja:

#include
uporaba imenskega prostora std;
predloga void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

predloga void func (T ne, const char * str)

cout << "There are " << no << " books worth $" << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
func (12, "500");
vrnitev 0;

Rezultat je:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Predloge za predavanja

Značilnosti zgoraj omenjenih predlog veljajo podobno kot predloge razredov. Naslednji program je izjava, definicija in uporaba preprostega razreda:

#include
uporaba imenskega prostora std;
razred TheCla

javno:
int številka;
statični znak;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statična praznina (char ch)

če (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.število = 12;
obj.func ('$', "500");
vrnitev 0;

Rezultat je naslednji:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Naslednji program je zgornji program z izjavo o glavi predloge:

#include
uporaba imenskega prostora std;
predloga razred TheCla

javno:
T številka;
statični U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statična praznina (U ch)

če (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.število = 12;
obj.func ('$', "500");
vrnitev 0;

Namesto imena tipa besede na seznamu parametrov predloge je mogoče uporabiti razred besed. Upoštevajte specializacijo pri deklaraciji predmeta. Izhod je še vedno enak:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Ločitev izjave

Izjavo predloge razreda je mogoče ločiti od kode razreda, kot sledi:

predloga razred TheCla;
predloga razred TheCla

javno:
T številka;
statični U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statična praznina (U ch)

če (ch == 'a')
cout << "Official static member function" << '\n';

;

Obravnavanje statičnih članov

Naslednji program prikazuje, kako dostopati do statičnega člana podatkov in funkcije statičnega člana:

#include
uporaba imenskega prostora std;
predloga razred TheCla

javno:
T številka;
statični U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statična praznina (U cha)

če (ch == 'a')
cout << "Official static member function" << cha << '\n';

;
predloga U TheCla:: ch = 'a';
int main ()

TheCla:: fun ('.');
vrnitev 0;

Dodelitev vrednosti statičnemu članu podatkov je izjava in ne more biti main (). Upoštevajte uporabo in položaje generičnih tipov in generičnega tipa podatkov v stavku o dodelitvi. Poleg tega upoštevajte, da je bila funkcija static static data priklicana v main () z dejanskimi podatkovnimi vrstami predloge. Rezultat je naslednji:

Uradna statična funkcija člana.

Sestavljanje

Izjava (glava) in definicija predloge morata biti v eni datoteki. To pomeni, da morajo biti v isti prevajalski enoti.

Zaključek

Predloge C ++ naredijo algoritem neodvisen od vrste uporabljenih podatkov. Entitete spremenljivke, funkcije, strukture in razreda imajo lahko predloge, ki vključujejo deklaracijo in definicijo. Ustvarjanje predloge vključuje tudi specializacijo, ko generični tip prevzame dejanski tip. Izjava in definicija predloge morata biti v eni prevajalski enoti.

Najboljši emulatorji igralne konzole za Linux
V tem članku bo navedena priljubljena programska oprema za emulacijo igralne konzole, ki je na voljo za Linux. Emulacija je sloj združljivosti program...
Najboljši Linux Distros za igre na srečo v letu 2021
Operacijski sistem Linux je daleč od prvotnega, preprostega, strežniškega videza. Ta OS se je v zadnjih letih izjemno izboljšal in se je zdaj razvil v...
Kako zajeti in pretakati svojo igralno sejo v Linuxu
V preteklosti je bilo igranje iger le hobi, sčasoma pa je igralniška industrija zabeležila veliko rast glede tehnologije in števila igralcev. Občinstv...