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:
mallT 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 << piJa funktsioon kuvaks 3.14. Avaldis pi
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:
mallU 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:
mallT 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:
Vanusedcout << 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:
mallT Johannes = 11;
U Peetrus = 12.3;
T Maarja = 13;
U rõõm = 14.6;
;
Funktsiooni main () asjakohane kood on järgmine:
Vanusedcout << 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:
mallT John;
U Peeter;
T Maarja;
U Rõõm;
;
Vanused
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:
# kaasatanimeruumi kasutamine std;
mall
T John = N;
U Peetrus = 12.3;
T Maarja = N;
U rõõm = 14.6;
;
int main ()
Vanused
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:
# kaasatanimeruumi 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
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:
Vanusedcout << 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:
# kaasatanimeruumi kasutamine std;
mall
int Johannes = 11;
ujuk Peeter = 12.3;
int Maarja = 13;
ujuk Rõõm = 14.6;
;
int main ()
Vanused
cout << gradeB.John << " << gradeB.Mary << '\n';
Vanused
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Vanused
cout << gradeD.John << " << gradeD.Joy << '\n';
Vanused <> klass A; // meeldib vaikimisi
cout << gradeA.John << " << gradeA.Joy << '\n';
tagastama 0;
Väljund on:
11 1312.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:
# kaasatanimeruumi kasutamine std;
mall
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:
# kaasatanimeruumi kasutamine std;
mall
mall
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:
# kaasatanimeruumi kasutamine std;
mall
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
mall
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:
# kaasatanimeruumi 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:
# kaasatanimeruumi kasutamine std;
mall
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.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:
mallmall
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:
# kaasatanimeruumi kasutamine std;
mall
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
int main ()
TheCla
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.