C ++

Kā izmantot C ++ veidnes

Kā izmantot C ++ veidnes

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:

veidne
T 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 << pi << '\n';

Un funkcija parādīs 3.14. Izteiciens pi izlemj precīzu T veidu mainīgajam pi. Specializācija izlemj konkrēto veidnes parametra datu tipu. Instantācija ir C ++ iekšējais process, veidojot konkrētu tipu, piemēram, pludiņu, šajā gadījumā. Nejauciet starp veidnes parametra un klases ātrumu. Veidnes tēmā daudziem datu tipiem var būt viens vispārīgs tipa nosaukums, savukārt daudzām klasēm var būt viens vispārējs klases nosaukums. Tomēr klases vispārīgo klases nosaukumu vienkārši sauc par klasi, nevis par klases nosaukumu. Vērtība ir arī datu tipam, piemēram, int, kā instiencēts objekts ir klasei, piemēram, klasei String.

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:

veidne
U 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:

veidne struktūras laikmeti

T 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:

Vecums pakāpe7;
cout << 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:

veidne struktūras laikmeti

T Jānis = 11;
U Pēteris = 12.3;
T Marija = 13;
U prieks = 14.6;
;

Funkcijai main () funkcija ir šāds kods:

Vecums pakāpe7;
cout << 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:

veidne struktūras laikmeti

T Jānis;
U Pēteris;
T Marija;
U prieks;
;
Vecums pakāpe7 = 11, 12.3, 13, 14.6;

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ļaut
izmantojot nosaukumvietu std;
veidne struktūras laikmeti

T Jānis = N;
U Pēteris = 12.3;
T Marija = N;
U prieks = 14.6;
;
int main ()

Vecums pakāpe7;
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ļaut
izmantojot 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 pakāpe7;
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:

Vecums pakāpe7;
cout << 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ļaut
izmantojot nosaukumvietu std;
veidne struktūras laikmeti

int Jānis = 11;
pludiņš Pēteris = 12.3;
int Marija = 13;
pludiņš Prieks = 14.6;
;
int main ()

Vecums pakāpeB;
cout << gradeB.John << " << gradeB.Mary << '\n';
Vecums pakāpeC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Vecums pakāpeD;
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 13
12.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ļaut
izmantojot nosaukumvietu std;
veidne void func (T nē, U cha, const char * str)

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ļaut
izmantojot nosaukumvietu std;
veidne void func (T nē, U cha, const char * str);
veidne void func (T nē, U cha, const char * str)

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ļaut
izmantojot nosaukumvietu std;
veidne void func (T nē, U cha, const char * str)

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

veidne void func (T nē, const char * str)

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ļaut
izmantojot 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ļaut
izmantojot nosaukumvietu std;
veidne klase TheCla

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;
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:

veidne klase TheCla;
veidne klase TheCla

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ļaut
izmantojot nosaukumvietu std;
veidne klase TheCla

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 U TheCla:: ch = 'a';
int main ()

TheCla:: jautri ('.');
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ā.

Peles kreisā klikšķa poga nedarbojas operētājsistēmā Windows 10
Ja ar klēpjdatoru vai galddatoru izmantojat īpašu peli, bet nedarbojas peles kreisās klikšķa poga kādu iemeslu dēļ operētājsistēmā Windows 10/8/7 šeit...
Rakstot Windows 10, kursors lec vai pārvietojas nejauši
Ja atklājat, ka peles kursors automātiski, nejauši lec vai pārvietojas pats, rakstot Windows klēpjdatorā vai datorā, daži no šiem ieteikumiem var palī...
Kā mainīt peles un skārienpaliktņu ritināšanas virzienu operētājsistēmā Windows 10
Pele un SkārienpaliktnisTas ne tikai padara skaitļošanu vienkāršu, bet arī efektīvāku un mazāk laikietilpīgu. Mēs nevaram iedomāties dzīvi bez šīm ier...