Uvod
U osnovnom programiranju na C ++, vrsta podataka, npr.g., int ili char, mora biti naznačeno u deklaraciji ili definiciji. Vrijednost kao što je 4 ili 22 ili -5 je int. Vrijednost kao što je "A" ili "b" ili "c" je znak. Mehanizam predloška omogućuje programeru da koristi generički tip za skup stvarnih tipova. Na primjer, programer može odlučiti upotrijebiti identifikator T za int ili char. Moguće je da algoritam C ++ ima više od jednog generičkog tipa. Uz, recimo, T za int ili char, U može značiti tip plutajućeg ili pokazivača. Klasa, poput niza ili vektorske klase, slična je vrsti podataka, a instancirani su objekti poput vrijednosti vrste podataka, koja je navedena klasa. Dakle, mehanizam predloška također omogućava programeru da koristi generički identifikator tipa za skup klasa.
Predložak C ++ stvara algoritam neovisan o vrsti podataka koji se koriste. Dakle, isti algoritam, s mnogo pojavljivanja istog tipa, može koristiti različite tipove pri različitim izvršenjima. Entiteti varijable, funkcije, strukture i klase mogu imati predloške. Ovaj članak objašnjava kako prijaviti predloške, kako definirati predloške i kako ih primijeniti u C-u++. Već biste trebali imati znanje o gore spomenutim entitetima da biste razumjeli teme obrađene u ovom članku.
Vrste
Skalar
Tipovi skalara su void, bool, char, int, float i pokazivač.
Nastava kao vrste
Određena klasa može se smatrati vrstom, a njezini objekti mogućim vrijednostima.
Generički tip predstavlja skup skalarnih tipova. Popis skalarnih vrsta je opsežan. Tip int, na primjer, ima i druge srodne tipove, poput kratkog int, long int itd. Generički tip također može predstavljati skup klasa.
Promjenjiva
Primjer deklaracije predloška i definicije je kako slijedi:
predložakT pi = 3.14;
Prije nastavka imajte na umu da se ova vrsta izjave ne može pojaviti u glavnoj () funkciji ili bilo kojem opsegu bloka. Prvi redak je deklaracija glave predloška, s generičkim nazivom tipa T, kojeg je izabrao programer. Sljedeći je redak definicija identifikatora, pi, koji je generičkog tipa, T. Preciznost, je li T int ili float ili neki drugi tip, može se izvršiti u funkciji C ++ main () (ili nekoj drugoj funkciji). Takva preciznost postići će se s varijablom pi, a ne s T.
Prvi redak je deklaracija glave predloška. Ova izjava započinje rezerviranom riječju, predloškom, a zatim otvorenim i zatvorenim kutnim zagradama. Unutar kutnih zagrada nalazi se barem jedan generički identifikator tipa, poput T, gore. Može postojati više od jednog generičkog identifikatora tipa, a svakom prethodi rezervirana riječ, typename. Takve generičke vrste na tom položaju nazivaju se parametri predloška.
Sljedeća izjava može se napisati u main () ili u bilo kojoj drugoj funkciji:
cout << piA funkcija bi prikazala 3.14. Izraz pi
Na specijalizaciji, odabrana vrsta podataka, poput float, stavlja se u kutne zagrade nakon varijable. Ako postoji više od jednog parametra predloška u deklaraciji glave predloška, u izrazu specijalizacije bit će odgovarajući broj tipova podataka istim redoslijedom.
Na specijalizaciji je tip poznat kao argument predloška. Nemojte brkati između ovoga i argumenta funkcije za poziv funkcije.
Zadana vrsta
Ako se na specijalizaciji ne navede tip, pretpostavlja se zadani tip. Dakle, iz sljedećeg izraza:
predložakU pi = "ljubav";
prikaz iz:
cout << pi<> << '\n';
je "ljubav" prema stalnom pokazivaču na char. Primijetite u deklaraciji da je U = const char *. Kutne zagrade bit će prazne na specijalizaciji (nije navedena vrsta); stvarni se tip smatra const pokazivačem na char, zadani tip. Ako bi na specijalizaciji bio potreban neki drugi tip, tada bi se naziv tipa napisao u kutnim zagradama. Kada se na specijalizaciji želi zadani tip, ponavljanje tipa u kutnim zagradama nije obavezno, tj.e., kutne zagrade mogu ostati prazne.
Napomena: zadani tip se i dalje može promijeniti na specijalizaciji tako što ćete imati drugi tip.
strukt
Sljedeći primjer pokazuje kako se parametar predloška može koristiti sa strukturom:
predložakT Ivan = 11;
T Petar = 12;
T Marija = 13;
T Radost = 14;
;
Ovo su uzrasti učenika u nekom razredu (razredu). Prvi redak je deklaracija predloška. Tijelo u zagradama stvarna je definicija predloška. Dobe se mogu prikazati u funkciji main () na sljedeći način:
Dobacout << grade7.John << " << grade7.Mary << '\n';
Izlaz je: 11 13. Prva izjava ovdje vrši specijalizaciju. Imajte na umu kako je napravljen. Također daje naziv za objekt strukture: grade7. Druga izjava ima uobičajene izraze objektnih struktura. Struktura je poput klase. Ovdje je Ages poput naziva klase, dok je grade7 objekt klase (struct).
Ako su neke dobi cjelobrojne, a druge floats, tada strukturi trebaju dva generička parametra, kako slijedi:
predložakT Ivan = 11;
U Petru = 12.3;
T Marija = 13;
U Radost = 14.6;
;
Relevantni kod za funkciju main () je kako slijedi:
Dobacout << grade7.John << " << grade7.Peter << '\n';
Izlaz je: 11 12.3. Pri specijalizaciji, redoslijed tipova (argumenata) mora odgovarati redoslijedu generičkih tipova u deklaraciji.
Deklaracija predloška može se odvojiti od definicije, kako slijedi:
predložakT Ivan;
U Petar;
T Marija;
U Radost;
;
Doba
Prvi segment koda isključivo je deklaracija predloška (nema dodjela). Drugi segment koda, koji je samo izjava, je definicija identifikatora, grade7. S lijeve strane nalazi se izjava identifikatora, ocjena7. Desna strana je popis inicijalizatora koji članovima strukture dodjeljuje odgovarajuće vrijednosti. Drugi segment (iskaz) može se zapisati u funkciji main (), dok prvi segment ostaje izvan funkcije main ().
Netipski
Primjeri tipova podataka koji nisu podaci uključuju vrste int, pokazivač na objekt, pokazivač na funkciju i automatske tipove. Postoje i druge vrste koje se ne odnose na ovaj članak. Netip je poput nepotpunog tipa čija se vrijednost daje kasnije i ne može se mijenjati. Kao parametar započinje određenim netipom, nakon kojeg slijedi identifikator. Vrijednost identifikatora daje se kasnije, na specijalizaciji, i ne može se ponovno mijenjati (poput konstante, čija je vrijednost dana kasnije). Sljedeći program to ilustrira:
#includepomoću prostora imena std;
predložak
T Ivan = N;
U Petru = 12.3;
T Marija = N;
U Radost = 14.6;
;
int main ()
Doba
cout << grade7.John << " << grade7.Joy << '\n';
return 0;
Na specijalizaciji, prvi tip, int, u kutnim zagradama postoji više zbog formalnosti, kako bi bili sigurni da broj i redoslijed parametara odgovara broju i redoslijedu vrsta (argumenti). Vrijednost N dana je na specijalizaciji. Izlaz je: 11 14.6.
Djelomična specijalizacija
Pretpostavimo da predložak ima četiri generička tipa i da, između četiri tipa, postoje potrebe za dva zadana tipa. To se može postići pomoću konstrukcije djelomične specijalizacije koja ne zapošljava operatora dodjele. Dakle, konstrukcija djelomične specijalizacije daje zadane vrijednosti podskupu generičkih tipova. Međutim, u shemi djelomične specijalizacije potrebne su osnovna klasa (struct) i djelomična klasa specijalizacije (struct). Sljedeći program to ilustrira za jedan generički tip od dva generička tipa:
#includepomoću prostora imena std;
// osnovna klasa predloška
predložak
strukturna Doba
;
// djelomična specijalizacija
predložak
strukturna Doba
T1 Ivan = 11;
plutajuće Petar = 12.3;
T1 Marija = 13;
plutajuća Radost = 14.6;
;
int main ()
Doba
cout << grade7.John << " << grade7.Joy << '\n';
return 0;
Identificirajte deklaraciju osnovne klase i njezinu djelomičnu definiciju klase. Deklaracija glave predloška osnovne klase ima sve potrebne generičke parametre. Deklaracija glave predloška klase djelomične specijalizacije ima samo generički tip. U shemi se koristi dodatni set kutnih zagrada koji dolazi neposredno nakon naziva klase u definiciji djelomične specijalizacije. To je ono što zapravo čini djelomičnu specijalizaciju. Ima zadani tip i ne-zadani tip, redoslijedom napisanim u osnovnoj klasi. Imajte na umu da zadani tip još uvijek može dobiti drugi tip u funkciji main ().
Relevantni kod u funkciji main () može biti sljedeći:
Dobacout << grade7.John << " << grade7.Joy << '\n';
Izlaz je: 11 14.6.
Paket parametara predloška
Paket parametara je parametar predloška koji prihvaća nula ili više generičkih tipova predložaka za odgovarajuće tipove podataka. Parametar paketa parametara započinje rezerviranim imenom tipa ili klase riječi. Nakon toga slijede tri točke, a zatim identifikator pakiranja. Sljedeći program ilustrira kako se paket parametara predloška može koristiti sa strukturom:
#includepomoću prostora imena std;
predložak
int Ivan = 11;
plutajuće Petar = 12.3;
int Marija = 13;
plutajuća Radost = 14.6;
;
int main ()
Doba
cout << gradeB.John << " << gradeB.Mary << '\n';
Doba
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Doba
cout << gradeD.John << " << gradeD.Joy << '\n';
Dob <> razred A; // poput zadanog
cout << gradeA.John << " << gradeA.Joy << '\n';
return 0;
Izlaz je:
11 1312.3 14.6
11 14.6
11 14.6
Predlošci funkcija
Gore navedene značajke predloška primjenjuju se na sličan način na predloške funkcija. Sljedeći program prikazuje funkciju s dva generička parametra predloška i tri argumenta:
#includepomoću prostora imena std;
predložak
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
return 0;
Izlaz je sljedeći:
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.
Odvajanje od prototipa
Definicija funkcije može se odvojiti od njenog prototipa, kao što pokazuje sljedeći program:
#includepomoću prostora imena std;
predložak
predložak
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
return 0;
Napomena: Deklaracija predloška funkcije ne može se pojaviti u glavnoj () funkciji ili bilo kojoj drugoj funkciji.
Preopterećenje
Preopterećenje iste funkcije može se dogoditi s različitim deklaracijama glave predloška. Sljedeći program to ilustrira:
#includepomoću prostora imena std;
predložak
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
predložak
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
func (12, "500");
return 0;
Izlaz je:
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.
Predlošci predavanja
Značajke gore spomenutih predložaka primjenjuju se na sličan način kao predlošci razreda. Sljedeći je program deklaracija, definicija i uporaba jednostavne klase:
#includepomoću prostora imena std;
razred TheCla
javnost:
int num;
statički char ch;
void func (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statična šupljina (char ch)
ako (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;
Izlaz je sljedeći:
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.
Sljedeći je program gornji program s deklaracijom glave predloška:
#includepomoću prostora imena std;
predložak
javnost:
T broj;
statički U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
zabava u statičkoj praznini (U ch)
ako (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla
obj.num = 12;
obj.func ('$', "500");
return 0;
Umjesto naziva vrste riječi na popisu parametara predloška, može se koristiti klasa riječi. Zabilježite specijalizaciju u deklaraciji objekta. Izlaz je i dalje isti:
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.
Izdvajanje deklaracije
Deklaracija predloška klase može se odvojiti od koda klase, kako slijedi:
predložakpredložak
javnost:
T broj;
statički U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
zabava u statičkoj praznini (U ch)
ako (ch == 'a')
cout << "Official static member function" << '\n';
;
Suočavanje sa statičnim članovima
Sljedeći program pokazuje kako pristupiti statičnom članu podataka i funkciji statičkog člana:
#includepomoću prostora imena std;
predložak
javnost:
T broj;
statički U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
zabava u statičkoj praznini (U cha)
ako (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
predložak
int main ()
TheCla
return 0;
Dodjela vrijednosti statičnom članu podataka je deklaracija i ne može biti u main (). Zabilježite upotrebu i položaje generičkih vrsta i generičkog tipa podataka u izrazu dodjele. Uz to, imajte na umu da je funkcija statičkog člana podataka pozvana u main (), sa stvarnim vrstama podataka predloška. Rezultat je sljedeći:
Službena statička funkcija člana.
Sastavljanje
Izjava (zaglavlje) i definicija predloška moraju biti u jednoj datoteci. Odnosno, moraju biti u istoj prijevodnoj jedinici.
Zaključak
C ++ predlošci čine algoritam neovisan o vrsti podataka koji se koriste. Entiteti varijable, funkcije, strukture i klase mogu imati predloške, koji uključuju deklaraciju i definiciju. Stvaranje predloška također uključuje specijalizaciju, a to je kada generički tip uzima stvarni tip. Izjava i definicija predloška moraju biti u jednoj prijevodnoj jedinici.