Ievads
C ++ pamata programmēšanā datu tips, t.g., int vai char, jānorāda deklarācijā vai definīcijā. Vērtība, piemēram, 4 vai 22 vai -5, ir int. Tāda vērtība kā “A”, “b” vai “c” ir char. Veidnes mehānisms ļauj programmētājam izmantot vispārīgu tipu faktisko tipu kopai. Piemēram, programmētājs var nolemt izmantot identifikatoru T int vai char. C ++ algoritmam var būt vairāk nekā viens vispārīgs tips. Ar, teiksim, T int vai char, U var apzīmēt pludiņa vai rādītāja tipu. Klase, piemēram, virkne vai vektoru klase, ir kā datu tips, un eksponētie objekti ir kā datu veida vērtības, kas ir norādītā klase. Tātad veidņu mehānisms arī ļauj programmētājam izmantot vispārīgu tipa identifikatoru klašu kopai.
C ++ veidne izveido algoritmu, kas nav atkarīgs no izmantoto datu veida. Tātad tas pats algoritms ar daudziem viena veida gadījumiem var izmantot dažādus veidus dažādās izpildēs. Mainīgā, funkcijas, struktūras un klases entītijām var būt veidnes. Šajā rakstā ir paskaidrots, kā deklarēt veidnes, kā definēt veidnes un kā tās lietot C++. Jums jau vajadzētu būt zināšanām par iepriekšminētajām entītijām, lai izprastu šajā rakstā aplūkotās tēmas.
Veidi
Skalārs
Skalāri veidi ir tukši, bool, char, int, float un pointer.
Klases kā veidi
Konkrētu klasi var uzskatīt par tipu un tā objektus kā iespējamās vērtības.
Vispārējs tips apzīmē skalāru tipu kopumu. Skalāru tipu saraksts ir plašs. Piemēram, int tipam ir citi saistīti veidi, piemēram, īss int, garš int utt. Vispārējs tips var attēlot arī klašu kopu.
Mainīgs
Deklarācijas un definīcijas veidnes piemērs ir šāds:
veidneT pi = 3.14;
Pirms turpināt, ņemiet vērā, ka šāda veida paziņojums nevar parādīties galvenajā () funkcijā vai nevienā bloķēšanas sfērā. Pirmā rinda ir veidnes-galvas deklarācija ar programmētāja izvēlēto vispārīgo tipa nosaukumu T. Nākamā rinda ir identifikatora pi definīcija, kas ir vispārēja tipa T. Precizitāti neatkarīgi no tā, vai T ir int, pludiņš vai kāds cits tips, var izdarīt ar funkciju C ++ main () (vai kādu citu funkciju). Šāda precizitāte tiks veikta ar mainīgo pi, nevis ar T.
Pirmā rinda ir veidnes-galvas deklarācija. Šī deklarācija sākas ar rezervēto vārdu, veidni un pēc tam ar atvērta un slēgta leņķa iekavām. Leņķa iekavās iepriekš ir vismaz viens vispārējs tipa identifikators, piemēram, T. Var būt vairāk nekā viens vispārēja tipa identifikators, pirms katra no tiem ir rezervēts vārds, typename. Šādus vispārīgus tipus šajā pozīcijā sauc par veidnes parametriem.
Šādu paziņojumu var rakstīt main () vai jebkurā citā funkcijā:
cout << piUn funkcija parādīs 3.14. Izteiciens pi
Specializējoties izvēlētais datu tips, piemēram, pludiņš, tiek ievietots iekavās iekavās aiz mainīgā. Ja veidnes-galvas deklarācijā ir vairāk nekā viens veidnes parametrs, specializācijas izteiksmē tajā pašā secībā būs atbilstošs datu tipu skaits.
Specializācijā tips ir pazīstams kā veidnes arguments. Nejauciet to un funkcijas argumenta funkciju izsaukumu.
Noklusējuma tips
Ja specializācijā nav norādīts neviens veids, tiek pieņemts noklusējuma tips. Tātad no šādas izteiksmes:
veidneU pi = "mīlestība";
displejs no:
cout << pi<> << '\n';
ir “mīlestība” pret pastāvīgo norādi uz char. Deklarācijā ņemiet vērā, ka U = const char *. Specializācijā leņķa iekavas būs tukšas (veids nav norādīts); faktiskais tips tiek uzskatīts par konta rādītāju uz char, noklusējuma tips. Ja specializācijā būtu vajadzīgs kāds cits tips, tipa nosaukums tiktu ierakstīts leņķa iekavās. Ja specializācijā ir vēlams noklusējuma veids, tipa atkārtojums leņķa iekavās nav obligāts, t.i.e., leņķa kronšteinus var atstāt tukšus.
Piezīme: noklusējuma tipu specializācijas jomā joprojām var mainīt, izmantojot citu tipu.
struktur
Šis piemērs parāda, kā veidnes parametru var izmantot ar struktūru:
veidneT Jānis = 11;
T Pēteris = 12;
T Marija = 13;
T prieks = 14;
;
Tie ir skolēnu vecumi klasē (klasē). Pirmā rinda ir veidnes deklarācija. Bikšturu korpuss ir faktiskā veidnes definīcija. Vecumus var norādīt galvenajā () funkcijā ar šādām iespējām:
Vecumscout << grade7.John << " << grade7.Mary << '\n';
Rezultāts ir: 11 13. Pirmais paziņojums šeit veic specializāciju. Ievērojiet, kā tas ir izgatavots. Tas arī piešķir struktūras objekta nosaukumu: grade7. Otrajam apgalvojumam ir parastas struktūras objektu izteiksmes. Struktūra ir kā klase. Šeit Ages ir kā klases nosaukums, savukārt grade7 ir klases objekts (struct).
Ja daži vecumi ir veseli skaitļi, bet citi ir pludiņi, struktūrai ir nepieciešami divi vispārīgi parametri:
veidneT Jānis = 11;
U Pēteris = 12.3;
T Marija = 13;
U prieks = 14.6;
;
Funkcijai main () funkcija ir šāds kods:
Vecumscout << grade7.John << " << grade7.Peter << '\n';
Rezultāts ir: 11 12.3. Specializējoties tipu (argumentu) secībai jāatbilst deklarācijā esošo vispārīgo tipu secībai.
Deklarācijas veidni var atdalīt no definīcijas šādi:
veidneT Jānis;
U Pēteris;
T Marija;
U prieks;
;
Vecums
Pirmais koda segments ir tikai veidnes deklarācija (nav piešķiršanas). Otrais koda segments, kas ir tikai paziņojums, ir identifikatora, grade7, definīcija. Kreisajā pusē ir identifikatora 7. pakāpes deklarācija. Labajā pusē ir inicializētāju saraksts, kas piešķir attiecīgas vērtības struktūras locekļiem. Otro segmentu (paziņojumu) var ierakstīt galvenajā () funkcijā, savukārt pirmais segments paliek ārpus galvenās () funkcijas.
Netipisks
Datu veidu piemēri ir int, rādītājs pret objektu, rādītājs uz funkciju un automātiskie veidi. Ir arī citi netipiski veidi, kurus šajā rakstā nerisina. Netipisks ir kā nepilnīgs tips, kura vērtība tiek dota vēlāk un to nevar mainīt. Kā parametrs tas sākas ar noteiktu netipisku, kam seko identifikators. Identifikatora vērtība tiek dota vēlāk, specializējoties, un to vairs nevar mainīt (piemēram, konstante, kuras vērtība tiek dota vēlāk). To ilustrē šāda programma:
# iekļautizmantojot nosaukumvietu std;
veidne
T Jānis = N;
U Pēteris = 12.3;
T Marija = N;
U prieks = 14.6;
;
int main ()
Vecums
cout << grade7.John << " << grade7.Joy << '\n';
atgriešanās 0;
Specializējoties leņķa iekavās pirmais tips int ir vairāk paredzēts formalitātei, lai pārliecinātos, ka parametru skaits un secība atbilst tipu skaitam un secībai (argumenti). N vērtība ir norādīta specializācijā. Rezultāts ir: 11 14.6.
Daļēja specializācija
Pieņemsim, ka veidnei ir četri vispārīgi veidi un ka starp četriem veidiem ir vajadzīgi divi noklusējuma veidi. To var panākt, izmantojot daļējas specializācijas konstrukciju, kurā netiek izmantots piešķiršanas operators. Tātad daļējās specializācijas konstrukcija piešķir noklusējuma vērtības vispārīgo tipu apakškopai. Tomēr daļējas specializācijas shēmā ir nepieciešama bāzes klase (struct) un daļēja specializācijas klase (struct). Šī programma ilustrē to vienam vispārējam veidam no diviem vispārīgiem veidiem:
# iekļautizmantojot nosaukumvietu std;
// bāzes veidnes klase
veidne
struktūras laikmeti
;
// daļēja specializācija
veidne
struktūras laikmeti
T1 Jānis = 11;
pludiņš Pēteris = 12.3;
T1 Marija = 13;
pludiņš Prieks = 14.6;
;
int main ()
Vecums
cout << grade7.John << " << grade7.Joy << '\n';
atgriešanās 0;
Identificējiet pamatklases deklarāciju un tās daļēju klases definīciju. Bāzes klases veidnes-galvas deklarācijā ir visi nepieciešamie vispārīgie parametri. Daļējas specializācijas klases veidnes-galvas deklarācijai ir tikai vispārīgais tips. Shēmā ir papildu leņķa iekavu komplekts, kas nāk tieši pēc klases nosaukuma daļējās specializācijas definīcijā. Tas ir tas, kas faktiski veic daļēju specializāciju. Tam ir noklusējuma tips un noklusējuma tips secībā, kas ierakstīta bāzes klasē. Ņemiet vērā, ka noklusējuma tipam joprojām var piešķirt atšķirīgu veidu galvenajā () funkcijā.
Attiecīgais kods galvenajā () funkcijā var būt šāds:
Vecumscout << grade7.John << " << grade7.Joy << '\n';
Rezultāts ir: 11 14.6.
Veidņu parametru pakete
Parametru pakete ir veidnes parametrs, kas attiecīgajiem datu tipiem pieņem nulles vai vairāk vispārīgus veidņu veidus. Parametru pakas parametrs sākas ar rezervēto vārdu typename vai klasi. Tam seko trīs punkti un pēc tam iepakojuma identifikators. Šī programma parāda, kā veidnes parametru pakotni var izmantot ar struktūru:
# iekļautizmantojot nosaukumvietu std;
veidne
int Jānis = 11;
pludiņš Pēteris = 12.3;
int Marija = 13;
pludiņš Prieks = 14.6;
;
int main ()
Vecums
cout << gradeB.John << " << gradeB.Mary << '\n';
Vecums
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Vecums
cout << gradeD.John << " << gradeD.Joy << '\n';
Vecums <> pakāpeA; // patīk noklusējums
cout << gradeA.John << " << gradeA.Joy << '\n';
atgriešanās 0;
Rezultāts ir:
11 1312.3 14.6
11 14.6
11 14.6
Funkciju veidnes
Iepriekš minētās veidņu funkcijas tiek piemērotas līdzīgi funkciju veidnēm. Šī programma parāda funkciju ar diviem vispārīgiem veidnes parametriem un trim argumentiem:
# iekļautizmantojot nosaukumvietu std;
veidne
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
atgriešanās 0;
Rezultāts ir šāds:
Veikalā ir 12 grāmatas 500 USD vērtībā.
Atdalīšana no prototipa
Funkcijas definīciju var atdalīt no tās prototipa, kā parāda šī programma:
# iekļautizmantojot nosaukumvietu std;
veidne
veidne
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
atgriešanās 0;
Piezīme. Funkcijas veidnes deklarācija nevar parādīties ne galvenajā (), ne kādā citā funkcijā.
Pārslodze
Vienas un tās pašas funkcijas pārslodze var notikt, izmantojot dažādas veidnes-galvas deklarācijas. To ilustrē šāda programma:
# iekļautizmantojot nosaukumvietu std;
veidne
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
veidne
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
func (12, "500");
atgriešanās 0;
Rezultāts ir:
Veikalā ir 12 grāmatas 500 USD vērtībā.
Veikalā ir 12 grāmatas 500 USD vērtībā.
Klases veidnes
Iepriekš minētās veidņu funkcijas tiek piemērotas līdzīgi kā klases veidnēm. Šī programma ir vienkāršas klases deklarēšana, definīcija un izmantošana:
# iekļautizmantojot nosaukumvietu std;
klase TheCla
publiski:
int num;
statiskā char ch;
void func (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statisks tukšums (char ch)
ja (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla obj;
obj.skaitlis = 12;
obj.func ('$', "500");
atgriešanās 0;
Rezultāts ir šāds:
Veikalā ir 12 grāmatas 500 USD vērtībā.
Šī programma ir iepriekš minētā programma ar veidnes-galvas deklarāciju:
# iekļautizmantojot nosaukumvietu std;
veidne
publiski:
T numurs;
statiskā U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statisks tukšums (U ch)
ja (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla
obj.skaitlis = 12;
obj.func ('$', "500");
atgriešanās 0;
Veidnes parametru sarakstā vārda typename vietā var izmantot vārdu klasi. Ievērojiet specializāciju objekta deklarācijā. Rezultāts joprojām ir tāds pats:
Veikalā ir 12 grāmatas 500 USD vērtībā.
Deklarācijas atdalīšana
Klases veidnes deklarāciju var atdalīt no klases koda šādi:
veidneveidne
publiski:
T numurs;
statiskā U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statisks tukšums (U ch)
ja (ch == 'a')
cout << "Official static member function" << '\n';
;
Darbība ar statiskajiem locekļiem
Šī programma parāda, kā piekļūt statisko datu dalībniekam un statiskā locekļa funkcijai:
# iekļautizmantojot nosaukumvietu std;
veidne
publiski:
T numurs;
statiskā U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statisks tukšums (U cha)
ja (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
veidne
int main ()
TheCla
atgriešanās 0;
Vērtības piešķiršana statisko datu dalībniekam ir deklarācija, un tā nevar būt galvenā (). Piešķiršanas paziņojumā ņemiet vērā vispārīgo tipu un datu vispārīgā veida izmantošanu un pozīcijas. Turklāt ņemiet vērā, ka statisko datu dalībnieka funkcija ir izsaukta main () ar faktiskajiem veidņu datu tipiem. Rezultāts ir šāds:
Oficiālā statiskā locekļa funkcija.
Sastādīšana
Deklarācijai (galvenei) un veidnes definīcijai jābūt vienā failā. Tas ir, tiem jābūt vienā tulkošanas vienībā.
Secinājums
C ++ veidnes padara algoritmu neatkarīgu no izmantoto datu veida. Mainīgā, funkcijas, struktūras un klases entītijām var būt veidnes, kas ietver deklarāciju un definīciju. Veidnes izveidošana ietver arī specializāciju, kas ir tad, kad vispārējs tips ņem faktisko. Deklarācijai un veidnes definīcijai jābūt vienā tulkošanas vienībā.