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:
predlogaT 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 << piIn funkcija bi prikazala 3.14. Izraz pi
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:
predlogaU 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:
predlogaT 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:
Starostcout << 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:
predlogaT Janez = 11;
U Peter = 12.3;
T Marija = 13;
U radost = 14.6;
;
Ustrezna koda za funkcijo main () je naslednja:
Starostcout << 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:
predlogaT Janez;
U Peter;
T Marija;
U veselje;
;
Starost
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:
#includeuporaba imenskega prostora std;
predloga
T Janez = N;
U Peter = 12.3;
T Marija = N;
U radost = 14.6;
;
int main ()
Starost
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:
#includeuporaba 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
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:
Starostcout << 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:
#includeuporaba imenskega prostora std;
predloga
int Janez = 11;
plovec Peter = 12.3;
int Marija = 13;
float Joy = 14.6;
;
int main ()
Starost
cout << gradeB.John << " << gradeB.Mary << '\n';
Starost
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Starost
cout << gradeD.John << " << gradeD.Joy << '\n';
Starost <> razred A; // kot privzeto
cout << gradeA.John << " << gradeA.Joy << '\n';
vrnitev 0;
Rezultat je:
11 1312.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:
#includeuporaba imenskega prostora std;
predloga
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:
#includeuporaba imenskega prostora std;
predloga
predloga
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:
#includeuporaba imenskega prostora std;
predloga
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
predloga
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:
#includeuporaba 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:
#includeuporaba imenskega prostora std;
predloga
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.š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:
predlogapredloga
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:
#includeuporaba imenskega prostora std;
predloga
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
int main ()
TheCla
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.