C ++

C ++ mallide kasutamine

C ++ mallide kasutamine

Sissejuhatus

Põhiprogrammides C ++ on andmetüüp e.g., int või char, tuleb märkida deklaratsioonis või määratluses. Väärtus nagu 4 või 22 või -5 on int. Väärtus, näiteks „A”, „b” või „c”, on söe. Mallimehhanism võimaldab programmeerijal kasutada tegelike tüüpide jaoks üldist tüüpi. Näiteks võib programmeerija otsustada kasutada identifikaatorit T int või char jaoks. C ++ algoritmil võib olla rohkem kui üks üldine tüüp. Näiteks T või int või char korral võib U tähistada ujuki või osuti tüüpi. Klass, näiteks string või vektorklass, on nagu andmetüüp ja ekspresseeritud objektid on nagu andmetüübi väärtused, mis on määratud klass. Niisiis võimaldab mallimehhanism programmeerijal kasutada klasside komplekti jaoks ka üldist tüübiidentifikaatorit.

C ++ mall loob kasutatud andmete tüübist sõltumatu algoritmi. Niisiis, sama algoritm, millel on palju sama tüüpi esinemisi, võib erinevatel hukkamistel kasutada erinevaid tüüpe. Muutuja, funktsiooni, struktuuri ja klassi üksustel võivad olla mallid. Selles artiklis selgitatakse, kuidas mallid deklareerida, kuidas malle määratleda ja kuidas neid C-s rakendada++. Selles artiklis käsitletud teemade mõistmiseks peaksite juba teadma eelnimetatud üksusi.

Tüübid

Skalaar

Skalaartüübid on tühised, bool, char, int, float ja pointer.

Klassid kui tüübid

Konkreetset klassi võib pidada tüübiks ja selle objekte võimalike väärtustena.

Üldine tüüp tähistab skalaartüüpide kogumit. Skalaartüüpide loetelu on ulatuslik. Näiteks int-tüübil on muid seotud tüüpe, näiteks lühike int, pikk int jne. Üldine tüüp võib esindada ka klasside komplekti.

Muutuv

Deklaratsiooni ja definitsiooni näide on järgmine:

mall
T pi = 3.14;

Enne jätkamist pidage meeles, et sellist lauset ei saa kuvada funktsioonis main () ega üheski ploki ulatuses. Esimene rida on mallipea deklaratsioon koos programmeerija valitud üldise tüübinimega T. Järgmine rida on identifikaatori pi määratlus, mis on üldist tüüpi T. Täpsuse, olenemata sellest, kas T on int, ujuk või mõni muu tüüp, saab teha funktsioonis C ++ main () (või mõnes muus funktsioonis). Selline täpsus tehakse muutujaga pi ja mitte T-ga.

Esimene rida on mallipea deklaratsioon. See deklaratsioon algab reserveeritud sõna, malli ning seejärel avatud ja suletud nurga sulgudega. Nurksulgudes on ülal vähemalt üks üldtüübi identifikaator, näiteks T. Üldtüübi identifikaatoreid võib olla mitu, millest igaühele eelneb reserveeritud sõna tüpename. Selliseid selles asendis olevaid üldisi tüüpe nimetatakse malli parameetriteks.

Järgmise avalduse saab kirjutada maini () või mis tahes muusse funktsiooni:

cout << pi << '\n';

Ja funktsioon kuvaks 3.14. Avaldis pi otsustab muutuja pi täpse T-tüübi. Spetsialiseerumine otsustab malli parameetri konkreetse andmetüübi. Instantiatsioon on C ++ sisemine protsess konkreetse tüübi, näiteks ujuki loomiseks. Ärge ajage segi malliparameetri ja klassi kiirendamist. Malliteemas võib paljudel andmetüüpidel olla üks üldine tüübinimi, samas kui paljudel klassidel võib olla üks üldine klassi nimi. Klasside üldist klassinime nimetatakse aga lihtsalt klassiks, mitte klassinimeks. Samuti on väärtus andmetüübile, näiteks int, nagu instantsitud objekt klassile, näiteks klass String.

Spetsialiseerumisel paigutatakse valitud andmetüüp, näiteks ujuk, muutuja järele nurksulgudesse. Kui mallipea deklaratsioonis on rohkem kui üks malliparameeter, on spetsialiseerumisväljendis samas järjekorras vastav arv andmetüüpe.

Spetsialiseerumisel nimetatakse tüüpi mallargumendiks. Ärge segage seda funktsiooni kõne funktsiooni argumendi vahel.

Vaiketüüp

Kui spetsialiseerumisel ei anta ühtegi tüüpi, eeldatakse vaiketüüpi. Niisiis järgmise avaldise järgi:

mall
U pi = "armastus";
ekraan:
cout << pi<> << '\n';

on “armastus” pideva näpunäite vastu. Deklaratsioonis märkige, et U = const char *. Nurgaklambrid on spetsialiseerumisel tühjad (tüüpi pole antud); tegelikku tüüpi peetakse vaiketüübiks char-tähiseks. Kui spetsialiseerumisel oleks vaja mõnda muud tüüpi, kirjutataks tüübi nimi nurksulgudesse. Kui spetsialiseerumisel soovitakse vaiketüüpi, on nurga sulgudes tüübi kordamine valikuline, st.e., nurksulgude võib tühjaks jätta.

Märkus: vaiketüüpi saab spetsialiseerumisel ikkagi muuta, kasutades teist tüüpi.

struktuur

Järgmine näide näitab, kuidas malli parameetrit saab struktuuriga kasutada:

mall struktureeritud vanused

T Johannes = 11;
T Peetrus = 12;
T Maarja = 13;
T rõõm = 14;
;

Need on klassi (klassi) õpilaste vanused. Esimene rida on malli deklaratsioon. Traksidega keha on malli tegelik määratlus. Vanused saab funktsiooni main () välja anda järgmiselt:

Vanused hinne7;
cout << grade7.John << " << grade7.Mary << '\n';

Väljund on: 11 13. Esimene väide täidab spetsialiseerumist. Pange tähele, kuidas see on tehtud. See annab ka struktuuri objektile nime: hinne7. Teisel väitel on tavalised struktuurobjektide avaldised. Struktuur on nagu klass. Siin on Ages nagu klassi nimi, samas kui hinne 7 on klassi objekt (struct).

Kui mõned vanused on täisarvud ja teised ujukid, vajab struktuur kahte üldist parameetrit järgmiselt:

mall struktureeritud vanused

T Johannes = 11;
U Peetrus = 12.3;
T Maarja = 13;
U rõõm = 14.6;
;

Funktsiooni main () asjakohane kood on järgmine:

Vanused hinne7;
cout << grade7.John << " << grade7.Peter << '\n';

Väljund on: 11 12.3. Spetsialiseerumisel peab tüüpide (argumentide) järjekord vastama deklaratsioonis olevate üldtüüpide järjekorrale.

Deklaratsiooni malli saab definitsioonist eraldada järgmiselt:

mall struktureeritud vanused

T John;
U Peeter;
T Maarja;
U Rõõm;
;
Vanused hinne7 = 11, 12.3, 13, 14.6;

Esimene koodisegment on puhtalt malli deklaratsioon (määramisi pole). Teine koodisegment, mis on lihtsalt lause, on identifikaatori, klassi 7 määratlus. Vasakul pool on identifikaatori, klassi 7 deklaratsioon. Parempoolne on initsiaatorite loend, mis määrab struktuuriliikmetele vastavad väärtused. Teise segmendi (lause) saab kirjutada funktsiooni main (), esimene segment jääb aga funktsiooni main () alla.

Mitte-tüüp

Mitteandmetüüpide näited hõlmavad int, osuti objektile, osutaja funktsiooni ja automaatseid tüüpe. On ka teisi mittetüüpe, mida see artikkel ei käsitle. Mittetüüp on nagu mittetäielik tüüp, mille väärtus antakse hiljem ja seda ei saa muuta. Parameetrina algab see konkreetse mittetüübiga, millele järgneb identifikaator. Identifikaatori väärtus antakse hiljem spetsialiseerumisel ja seda ei saa uuesti muuta (nagu konstant, mille väärtus antakse hiljem). Järgmine programm illustreerib seda:

# kaasata
nimeruumi kasutamine std;
mall struktureeritud vanused

T John = N;
U Peetrus = 12.3;
T Maarja = N;
U rõõm = 14.6;
;
int main ()

Vanused hinne7;
cout << grade7.John << " << grade7.Joy << '\n';
tagastama 0;

Spetsialiseerumisel on nurksulgudes esimene tüüp int, mis on rohkem formaalsuse jaoks, et veenduda, et parameetrite arv ja järjestus vastavad tüüpide arvule ja järjekorrale (argumendid). N väärtus on antud spetsialiseerumisel. Väljund on: 11 14.6.

Osaline spetsialiseerumine

Oletame, et mallil on neli üldtüüpi ja et nelja tüübi hulgas on vaja kahte vaiketüüpi. Seda saab saavutada osalise spetsialiseerumise konstruktsiooni abil, mis ei kasuta määranguoperaatorit. Niisiis, osalise spetsialiseerumise konstruktsioon annab vaikeväärtused üldtüüpide alamhulgale. Osalise spetsialiseerumise skeemis on aga vaja baasklassi (struct) ja osalist spetsialiseerumisklassi (struct). Järgmine programm illustreerib seda ühe üldtüübi puhul kahest üldtüübist:

# kaasata
nimeruumi kasutamine std;
// baasmalli klass
mall
struktureeritud vanused

;
// osaline spetsialiseerumine
mall
struktureeritud vanused

T1 Johannes = 11;
ujuk Peeter = 12.3;
T1 Maarja = 13;
ujuk Rõõm = 14.6;
;
int main ()

Vanused hinne7;
cout << grade7.John << " << grade7.Joy << '\n';
tagastama 0;

Tehke kindlaks põhiklassi deklaratsioon ja selle osaline klassi määratlus. Baasklassi malli-pea deklaratsioonis on kõik vajalikud üldised parameetrid. Osalise spetsialiseerumisklassi malli-pea deklaratsioonil on ainult üldine tüüp. Skeemis on kasutatud täiendavat nurksulgude komplekti, mis tuleb osalise spetsialiseerumise definitsioonis vahetult klassi nime järele. See on see, mida osaline spetsialiseerumine tegelikult teeb. Sellel on vaiketüüp ja mitte-vaiketüüp põhiklassis kirjutatud järjekorras. Pange tähele, et vaiketüübile saab funktsiooni main () korral siiski anda teise tüübi.

Funktsiooni main () vastav kood võib olla järgmine:

Vanused hinne7;
cout << grade7.John << " << grade7.Joy << '\n';

Väljund on: 11 14.6.

Malliparameetrite pakett

Parameetrite pakett on malliparameeter, mis aktsepteerib vastavate andmetüüpide jaoks null või rohkem malli üldtüüpi. Parameetrikomplekti parameeter algab reserveeritud sõnaga tüüpnimi või klass. Sellele järgneb kolm punkti ja seejärel paki tunnus. Järgmine programm illustreerib, kuidas malli parameetrite paketti saab struktuuriga kasutada:

# kaasata
nimeruumi kasutamine std;
mall struktureeritud vanused

int Johannes = 11;
ujuk Peeter = 12.3;
int Maarja = 13;
ujuk Rõõm = 14.6;
;
int main ()

Vanused hinneB;
cout << gradeB.John << " << gradeB.Mary << '\n';
Vanused hinneC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Vanused hinneD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Vanused <> klass A; // meeldib vaikimisi
cout << gradeA.John << " << gradeA.Joy << '\n';
tagastama 0;

Väljund on:

11 13
12.3 14.6
11 14.6
11 14.6

Funktsioonimallid

Eespool nimetatud mallifunktsioonid kehtivad sarnaselt funktsioonimallidele. Järgmine programm näitab funktsiooni, millel on kaks üldist malli parameetrit ja kolm argumenti:

# kaasata
nimeruumi kasutamine std;
mall void func (T nr, U cha, const char * str)

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

int main ()

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

Väljund on järgmine:

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Eraldamine prototüübist

Funktsiooni definitsiooni saab eraldada selle prototüübist, nagu näitab järgmine programm:

# kaasata
nimeruumi kasutamine std;
mall void func (T nr, U cha, const char * str);
mall void func (T nr, U cha, const char * str)

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

int main ()

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

Märkus. Funktsioonimalli deklaratsiooni ei saa kuvada funktsioonis main () ega mõnes muus funktsioonis.

Ülekoormus

Sama funktsiooni ülekoormamine võib toimuda erinevate mallipea deklaratsioonidega. Järgmine programm illustreerib seda:

# kaasata
nimeruumi kasutamine std;
mall void func (T nr, U cha, const char * str)

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

mall void func (T nr, const char * str)

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

int main ()

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

Väljund on:

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Klassi mallid

Eespool nimetatud mallide funktsioonid kehtivad sarnaselt klassi mallidele. Järgmine programm on lihtsa klassi deklaratsioon, määratlus ja kasutamine:

# kaasata
nimeruumi kasutamine std;
klass TheCla

avalik:
int number;
staatiline süsinik;
tühine func (char cha, const char * str)

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

staatiline tühisus (char ch)

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

;
int main ()

TheCla obj;
obj.arv = 12;
obj.func ('$', "500");
tagastama 0;

Väljund on järgmine:

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Järgmine programm on ülaltoodud mall-head deklaratsiooniga programm:

# kaasata
nimeruumi kasutamine std;
mall klass TheCla

avalik:
T number;
staatiline U ch;
void func (U cha, const char * str)

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

staatiline tühine lõbu (U ch)

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

;
int main ()

TheCla obj;
obj.arv = 12;
obj.func ('$', "500");
tagastama 0;

Malliparameetrite loendis oleva sõna typename asemel võib kasutada sõna klassi. Pange tähele spetsialiseerumist objekti deklaratsioonis. Väljund on endiselt sama:

Poes on 12 raamatut, mille väärtus on 500 dollarit.

Deklaratsiooni eraldamine

Klassi malli deklaratsiooni saab klassi koodist eraldada järgmiselt:

mall klass TheCla;
mall klass TheCla

avalik:
T number;
staatiline U ch;
void func (U cha, const char * str)

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

staatiline tühine lõbu (U ch)

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

;

Staatiliste liikmetega tegelemine

Järgmine programm näitab, kuidas pääseda juurde staatilise andmeliikme ja staatilise liikme funktsioonile:

# kaasata
nimeruumi kasutamine std;
mall klass TheCla

avalik:
T number;
staatiline U ch;
void func (U cha, const char * str)

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

staatiline tühine lõbu (U cha)

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

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

TheCla:: lõbus ('.');
tagastama 0;

Staatilise andmeliikme jaoks väärtuse määramine on deklaratsioon ja see ei saa olla põhiline (). Pange tähele määramise avalduses üldtüüpide ja andmete üldtüüpide kasutamist ja positsioone. Lisaks pange tähele, et staatilise andmeliikme funktsiooni on kutsutud main () koos tegelike mallide andmetüüpidega. Väljund on järgmine:

Ametlik staatilise liikme funktsioon.

Koostamine

Deklaratsioon (päis) ja malli määratlus peavad olema ühes failis. See tähendab, et nad peavad olema samas tõlkeüksuses.

Järeldus

C ++ mallid muudavad algoritmi sõltumatuks kasutatud andmete tüübist. Muutuja, funktsiooni, struktuuri ja klassi üksustel võivad olla mallid, mis hõlmavad deklaratsiooni ja määratlust. Malli loomine hõlmab ka spetsialiseerumist, see tähendab, et üldine tüüp võtab tegeliku tüübi. Deklaratsioon ja malli määratlus peavad mõlemad olema ühes tõlkeüksuses.

Kuidas installida ja mängida Doomi Linuxis
Doomi sissejuhatus Doom-seeria sai alguse 90ndatel pärast algse Doomi väljaandmist. See oli kohene hitt ja sellest ajast alates on mänguseeria pälvinu...
Vulkan Linuxi kasutajatele
Iga uue põlvkonna graafikakaartidega näeme, et mängude arendajad ületavad graafilise truuduse piire ja jõuavad fotorealismile ühe sammu lähemale. Kuid...
OpenTTD vs Simutrans
Oma transpordisimulatsiooni loomine võib olla lõbus, lõõgastav ja äärmiselt köitev. Sellepärast peate endale meelepärase leidmiseks kindlasti proovima...