Įvadas
Vykdant pagrindinį C ++ programavimą, duomenų tipas, el.g., int arba char, turi būti nurodyti deklaracijoje arba apibrėžime. Tokia vertė kaip 4 arba 22 arba -5 yra int. Tokia vertė kaip „A“, „b“ ar „c“ yra simbolis. Šablono mechanizmas leidžia programuotojui naudoti bendrąjį tipą faktinių tipų rinkiniui. Pavyzdžiui, programuotojas gali nuspręsti naudoti identifikatorių T int arba char. C ++ algoritmas gali turėti daugiau nei vieną bendrą tipą. Sakydami, kad T yra int arba char, U gali reikšti plūduriuojančio arba rodyklinio tipo. Klasė, pvz., Eilutė arba vektorinė klasė, yra panaši į duomenų tipą, o išjudinti objektai yra kaip duomenų tipo reikšmės, tai yra nurodyta klasė. Taigi šablonų mechanizmas taip pat leidžia programuotojui klasėms naudoti bendrąjį tipo identifikatorių.
C ++ šablonas sukuria algoritmą, nepriklausantį nuo naudojamų duomenų tipo. Taigi tas pats algoritmas su daugybe to paties tipo įvykių gali naudoti skirtingus tipus vykdant skirtingas vykdymo operacijas. Kintamojo, funkcijos, struktūros ir klasės esybės gali turėti šablonus. Šiame straipsnyje paaiškinta, kaip deklaruoti šablonus, kaip apibrėžti šablonus ir kaip juos naudoti C++. Jūs jau turėtumėte žinoti apie minėtus subjektus, kad suprastumėte šiame straipsnyje aptariamas temas.
Tipai
Skalaras
Skaliariniai tipai yra tuštuma, bool, char, int, float ir pointer.
Klasės kaip tipai
Konkrečią klasę galima laikyti tipu, o jos objektus - kaip galimas vertes.
Bendrasis tipas reiškia skaliarinių tipų rinkinį. Skaliarinių tipų sąrašas yra platus. Pavyzdžiui, int tipas turi kitų susijusių tipų, tokių kaip trumpasis int, ilgasis int ir kt. Bendrasis tipas taip pat gali atstovauti klasių rinkinį.
Kintamasis
Deklaracijos šablono ir apibrėžimo pavyzdys yra toks:
šablonąT pi = 3.14;
Prieš tęsdami, atkreipkite dėmesį, kad tokio tipo teiginiai negali būti rodomi pagrindinėje () funkcijoje ar bet kurioje bloko srityje. Pirmoji eilutė yra šablono-galvos deklaracija su programuotojo pasirinktu bendru tipo pavadinimu T. Kita eilutė yra identifikatoriaus pi apibrėžimas, kuris yra bendro tipo T. Tikslumas, nesvarbu, ar T yra int, ar plūdė, ar kitas tipas, gali būti atliekamas naudojant funkciją C ++ main () (ar kurią nors kitą funkciją). Toks tikslumas bus atliekamas su kintamuoju pi, o ne su T.
Pirmoji eilutė yra šablono-galvos deklaracija. Ši deklaracija prasideda rezervuotu žodžiu, šablonu, o tada - atviro ir uždaro kampo skliaustais. Kampų skliaustuose aukščiau yra bent vienas bendro tipo identifikatorius, pvz., T. Gali būti daugiau nei vienas bendrojo tipo identifikatorius, prieš kiekvieną nurodant rezervuotą žodį, typename. Tokie bendrieji tipai toje padėtyje vadinami šablonų parametrais.
Šis sakinys gali būti parašytas main () arba bet kurioje kitoje funkcijoje:
cout << piIr funkcija rodys 3.14. Posakis pi
Specializuojantis, pasirinktas duomenų tipas, pvz., Plūduriuojantis, dedamas kampiniuose skliaustuose po kintamuoju. Jei šablono-galvos deklaracijoje yra daugiau nei vienas šablono parametras, specializacijos išraiškoje bus atitinkamas skaičius duomenų tipų ta pačia tvarka.
Specializuojantis tipas yra žinomas kaip šablono argumentas. Negalima painioti tarp to ir funkcijos argumento funkcijos iškvietimo.
Numatytasis tipas
Jei specializacijos metu nenurodomas joks tipas, laikomas numatytasis tipas. Taigi, iš šios išraiškos:
šablonąU pi = "meilė";
ekranas iš:
cout << pi<> << '\n';
yra „meilė“ nuolatiniam rodikliui į char. Deklaracijoje atkreipkite dėmesį, kad U = const char *. Specializuojant kampiniai skliaustai bus tušti (tipas nenurodytas); tikrasis tipas yra laikomas konstatuojančiuoju char, numatytasis tipas. Jei specializuojant reikėjo kokio nors kito tipo, tipo pavadinimas bus įrašytas kampiniuose skliaustuose. Kai specializacijos metu pageidaujama numatytojo tipo, tipo pakartojimas kampiniuose skliaustuose yra neprivalomas, t.e., kampinius skliaustus galima palikti tuščius.
Pastaba: numatytąjį tipą vis tiek galima pakeisti specializuojant, turint kitą tipą.
struktūros
Šiame pavyzdyje parodyta, kaip šablono parametrą galima naudoti su „Struct“:
šablonąT Jonas = 11;
T Petras = 12;
T Marija = 13;
T džiaugsmas = 14;
;
Tai yra klasės (klasės) mokinių amžius. Pirmoji eilutė yra deklaracijos šablonas. Kūnas breketais yra tikrasis šablono apibrėžimas. Amžius galima pateikti pagrindinėje () funkcijoje:
Amžiuscout << grade7.John << " << grade7.Mary << '\n';
Išvestis yra: 11 13. Pirmasis teiginys atlieka specializaciją. Atkreipkite dėmesį, kaip jis buvo pagamintas. Tai taip pat suteikia struktūros objekto pavadinimą: grade7. Antrasis teiginys turi įprastas struktūros objekto išraiškas. Struktūra yra kaip klasė. Čia „Ages“ yra tarsi klasės pavadinimas, o „7“ yra klasės objektas (struct).
Jei kai kurie amžiai yra sveiki skaičiai, o kiti yra plūduriuojantys, struktūrai reikia dviejų bendrų parametrų:
šablonąT Jonas = 11;
U Petras = 12.3;
T Marija = 13;
U džiaugsmas = 14.6;
;
Atitinkamas pagrindinis () funkcijos kodas yra toks:
Amžiuscout << grade7.John << " << grade7.Peter << '\n';
Išvestis yra: 11 12.3. Specializuojantis tipų (argumentų) eiliškumas turi atitikti bendrųjų tipų tvarką deklaracijoje.
Deklaracijos šabloną galima atskirti nuo apibrėžimo taip:
šablonąT Jonas;
U Petras;
T Marija;
U džiaugsmas;
;
Amžius
Pirmasis kodo segmentas yra grynai šablono deklaracija (nėra priskyrimų). Antrasis kodo segmentas, kuris yra tik teiginys, yra identifikatoriaus, laipsnio7, apibrėžimas. Kairėje pusėje yra identifikatoriaus, 7 laipsnio, deklaracija. Dešinėje pusėje yra inicialų sąrašas, kuris priskiria atitinkamas vertes struktūros nariams. Antrasis segmentas (teiginys) gali būti parašytas pagrindinėje () funkcijoje, o pirmasis segmentas lieka už pagrindinės () funkcijos ribų.
Ne tipas
Ne duomenų tipų pavyzdžiai yra int, rodyklė į objektą, rodyklė į funkciją ir automatiniai tipai. Yra ir kitų tipų, kurių šis straipsnis nenagrinėja. Netipas yra kaip neišsamus tipas, kurio vertė pateikiama vėliau ir negali būti pakeista. Kaip parametras, jis prasideda nuo tam tikro tipo, po kurio nurodomas identifikatorius. Identifikatoriaus vertė pateikiama vėliau, specializuojantis, ir jos negalima pakeisti (kaip konstanta, kurios vertė pateikiama vėliau). Tai iliustruoja ši programa:
# įtrauktinaudojant vardų sritį std;
šabloną
T Jonas = N;
U Petras = 12.3;
T Marija = N;
U džiaugsmas = 14.6;
;
int main ()
Amžius
cout << grade7.John << " << grade7.Joy << '\n';
grąžinti 0;
Specializuojantis, kampuose skliaustuose pateiktas pirmasis tipas int, labiau skirtas formalumui, siekiant įsitikinti, kad parametrų skaičius ir tvarka atitinka tipų (argumentų) skaičių ir tvarką. N vertė buvo pateikta specializuojantis. Rezultatas yra: 11 14.6.
Dalinė specializacija
Tarkime, kad šablone yra keturi bendrieji tipai ir kad tarp keturių tipų reikia dviejų numatytųjų tipų. Tai galima pasiekti naudojant dalinės specializacijos konstrukciją, kurioje nenaudojamas priskyrimo operatorius. Taigi dalinės specializacijos konstrukcija suteikia numatytąsias reikšmes bendrinių tipų pogrupiui. Tačiau dalinės specializacijos schemoje reikia bazinės klasės (struktūros) ir dalinės specializacijos klasės (struktūros). Ši programa iliustruoja tai vienam bendriniam tipui iš dviejų bendrų tipų:
# įtrauktinaudojant vardų sritį std;
// pagrindinio šablono klasė
šabloną
struktūros amžiai
;
// dalinė specializacija
šabloną
struktūros amžiai
T1 Jonas = 11;
plūduriuojantis Petras = 12.3;
T1 Marija = 13;
plūduriuojantis džiaugsmas = 14.6;
;
int main ()
Amžius
cout << grade7.John << " << grade7.Joy << '\n';
grąžinti 0;
Nurodykite pagrindinės klasės deklaraciją ir jos dalinę klasės apibrėžtį. Pagrindinės klasės šablono ir galvos deklaracijoje yra visi būtini bendrieji parametrai. Dalinės specializacijos klasės deklaracijos šablone-galvoje yra tik bendro tipo. Schemoje naudojamas papildomas kampinių skliaustų rinkinys, kuris pateikiamas iškart po klasės pavadinimo dalinės specializacijos apibrėžime. Tai iš tikrųjų daro dalinę specializaciją. Jis turi numatytąjį ir nenumatytąjį tipą tokia tvarka, kokia parašyta pagrindinėje klasėje. Atkreipkite dėmesį, kad numatytajam tipui vis tiek gali būti suteiktas kitas tipas pagrindinėje () funkcijoje.
Atitinkamas pagrindinis () funkcijos kodas gali būti toks:
Amžiuscout << grade7.John << " << grade7.Joy << '\n';
Rezultatas yra: 11 14.6.
Šablonų parametrų paketas
Parametrų paketas yra šablono parametras, kuris priima nulį ar daugiau bendrų šablonų tipų atitinkamiems duomenų tipams. Parametrų paketo parametras prasideda rezervuotu žodžiu typename arba class. Po to yra trys taškai, o tada - pakuotės identifikatorius. Ši programa parodo, kaip šablono parametrų paketą galima naudoti su „Struct“:
# įtrauktinaudojant vardų sritį std;
šabloną
int Jonas = 11;
plūduriuojantis Petras = 12.3;
int Marija = 13;
plūduriuojantis džiaugsmas = 14.6;
;
int main ()
Amžius
cout << gradeB.John << " << gradeB.Mary << '\n';
Amžius
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Amžius
cout << gradeD.John << " << gradeD.Joy << '\n';
Amžiai <> laipsnis A; // kaip numatytasis
cout << gradeA.John << " << gradeA.Joy << '\n';
grąžinti 0;
Rezultatas yra:
11 1312.3 14.6
11 14.6
11 14.6
Funkcijų šablonai
Pirmiau minėtos šablono funkcijos panašiai taikomos ir funkcijų šablonams. Ši programa rodo funkciją su dviem bendrais šablono parametrais ir trim argumentais:
# įtrauktinaudojant vardų sritį std;
šabloną
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
grąžinti 0;
Rezultatas yra toks:
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.
Atskyrimas nuo prototipo
Funkcijos apibrėžimą galima atskirti nuo jo prototipo, kaip rodo ši programa:
# įtrauktinaudojant vardų sritį std;
šabloną
šabloną
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
grąžinti 0;
Pastaba: Funkcijos šablono deklaracija negali būti rodoma pagrindinėje () ar kitoje funkcijoje.
Perkrovimas
Ta pati funkcija gali būti perkrauta naudojant skirtingas šablonų ir galvų deklaracijas. Tai iliustruoja ši programa:
# įtrauktinaudojant vardų sritį std;
šabloną
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
šabloną
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
func (12, "500");
grąžinti 0;
Rezultatas yra:
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.
Klasės šablonai
Aukščiau paminėtų šablonų funkcijos panašiai taikomos ir klasės šablonams. Ši programa yra paprastos klasės deklaravimas, apibrėžimas ir naudojimas:
# įtrauktinaudojant vardų sritį std;
klasė „TheCla“
vieša:
int num;
statinis char ch;
negaliojantis func (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statinis tuštumas (char ch)
jei (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla obj;
obj.skaičius = 12;
obj.func ('$', "500");
grąžinti 0;
Rezultatas yra toks:
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.
Ši programa yra aukščiau nurodyta programa su deklaracijos šablonu ant galvos:
# įtrauktinaudojant vardų sritį std;
šabloną
vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statinis tuštumas (U ch)
jei (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla
obj.skaičius = 12;
obj.func ('$', "500");
grąžinti 0;
Vietoje žodžio typename šablonų parametrų sąraše galima naudoti žodžių klasę. Atkreipkite dėmesį į specializaciją objekto deklaracijoje. Išvestis vis tiek ta pati:
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.
Atskiroji deklaracija
Klasės šablono deklaraciją galima atskirti nuo klasės kodo taip:
šablonąšabloną
vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statinis tuštumas (U ch)
jei (ch == 'a')
cout << "Official static member function" << '\n';
;
Darbas su statiniais nariais
Ši programa parodo, kaip pasiekti statinių duomenų narį ir statinio nario funkciją:
# įtrauktinaudojant vardų sritį std;
šabloną
vieša:
T skaičius;
statinis U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statinis tuštumas (U cha)
jei (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
šabloną
int main ()
TheCla
grąžinti 0;
Vertės priskyrimas statinių duomenų nariui yra deklaracija ir negali būti pagrindinis (). Priskyrimo sakinyje atkreipkite dėmesį į bendrųjų tipų ir duomenų bendrojo tipo naudojimą ir pozicijas. Be to, atkreipkite dėmesį, kad statinių duomenų nario funkcija buvo iškviesta main (), nurodant faktinius šablonų duomenų tipus. Rezultatas yra toks:
Oficiali statinio nario funkcija.
Kompiliavimas
Deklaracija (antraštė) ir šablono apibrėžimas turi būti viename faile. Tai yra, jie turi būti tame pačiame vertimo skyriuje.
Išvada
C ++ šablonai sukuria algoritmą, nepriklausantį nuo naudojamų duomenų tipo. Kintamojo, funkcijos, struktūros ir klasės subjektai gali turėti šablonus, kurie apima deklaravimą ir apibrėžimą. Kuriant šabloną taip pat reikalinga specializacija, tai yra tada, kai bendrasis tipas užima tikrąjį. Deklaracija ir šablono apibrėžimas turi būti viename vertimo skyriuje.