Bevezetés
Az alapvető C ++ programozásnál az adattípus, pl.g., int vagy char, nyilatkozatban vagy meghatározásban kell feltüntetni. Olyan érték, mint 4 vagy 22 vagy -5 int. Az olyan érték, mint az „A”, „b” vagy „c”, char. A sablonmechanizmus lehetővé teszi a programozó számára, hogy egy általános típust használjon a tényleges típusok halmazához. Például a programozó dönthet úgy, hogy a T azonosítót használja int vagy char használatához. Lehetséges, hogy egy C ++ algoritmusnak egynél több általános típusa legyen. Mondjuk T-vel az int vagy char esetében, U állhat az úszó vagy mutató típusra. Egy osztály, például a karakterlánc vagy a vektorosztály, olyan, mint egy adattípus, a példányosított objektumok pedig az adattípus értékei, amely a megadott osztály. Tehát a sablon mechanizmus lehetővé teszi a programozó számára, hogy általános típusú azonosítót használjon egy osztálykészlethez.
A C ++ sablon létrehoz egy algoritmust, amely független a felhasznált adatok típusától. Tehát ugyanaz az algoritmus, sok azonos típusú előfordulással, különböző típusokat használhat különböző végrehajtásoknál. A változó, függvény, struktúra és osztály entitásainak lehetnek sablonjai. Ez a cikk elmagyarázza, hogyan kell deklarálni a sablonokat, hogyan kell meghatározni a sablonokat, és hogyan kell alkalmazni őket a C-ben++. A cikkben tárgyalt témák megértéséhez már ismernie kell a fent említett entitásokat.
Típusok
Skalár
A skaláris típusok: void, bool, char, int, float és pointer.
Osztályok mint típusok
Egy adott osztály típusnak tekinthető, objektumai pedig lehetséges értékként.
Egy általános típus skaláris típusok halmazát jelenti. A skaláris típusok listája kiterjedt. Az int típusnak például vannak más kapcsolódó típusai, például rövid int, hosszú int stb. Egy általános típus osztályok halmazát is képviselheti.
Változó
A sablon deklarációra és meghatározásra példa a következő:
sablonT pi = 3.14;
Mielőtt folytatná, vegye figyelembe, hogy ez a fajta utasítás nem jelenhet meg a main () függvényben vagy bármely blokk hatókörben. Az első sor a sablon-fej deklaráció, a programozó által kiválasztott általános típusnévvel, T-vel. A következő sor a pi azonosító meghatározása, amely általános típusú, T. Pontosság, függetlenül attól, hogy a T int, úszó vagy valamilyen más típusú, elvégezhető a C ++ main () függvényben (vagy valamilyen más függvényben). Ilyen pontosságot a pi változóval kell végrehajtani, és nem T-vel.
Az első sor a sablon-fej deklaráció. Ez a nyilatkozat a fenntartott szóval, sablonnal, majd a nyitott és zárt szögletes zárójelekkel kezdődik. A szögletes zárójelek között legalább egy általános típusazonosító található, például T. Egynél több általános típusazonosító is lehet, mindegyiket megelőzi a fenntartott szó, a typename. Az ilyen általános típusokat abban a helyzetben sablonparamétereknek nevezzük.
Az alábbi állítás beírható a main () vagy bármely más függvénybe:
cout << piÉs a funkció 3-at jelenítene meg.14. A pi kifejezés
Szakosodáskor a választott adattípust, például az úszót, a változó után szögletes zárójelek közé kell helyezni. Ha egynél több sablonparaméter van a sablon-fej deklarációban, akkor a specializáció kifejezésben megfelelő számú adattípus lesz ugyanabban a sorrendben.
A specializációnál a típust sablon argumentumnak nevezik. Ne tévessze össze ezt és a függvényhívás argumentumát.
Alapértelmezett típus
Ha a specializációnál nem adnak meg típust, akkor az alapértelmezett típust feltételezzük. Tehát a következő kifejezésből:
sablonU pi = "szerelem";
a kijelző:
cout << pi<> << '\n';
„szeretet” az állandó mutatóra a char-ra. A nyilatkozatban vegye figyelembe, hogy U = const char *. A szögletes zárójelek üresek lesznek a specializációnál (típus nincs megadva); a tényleges típust a char, az alapértelmezett típus mutatójának tekintjük. Ha valamilyen más típusra lenne szükség a specializáció során, akkor a típus nevét a szögletes zárójelbe kell írni. Amikor a specializációnál az alapértelmezett típust kívánja megadni, akkor a típus megismétlése a sarok zárójelben opcionális, azaz.e., a sarok zárójelek üresen hagyhatók.
Megjegyzés: az alapértelmezett típust a szakterületen továbbra is megváltoztathatja egy másik típus megadása.
strukturált
A következő példa bemutatja, hogyan lehet egy sablonparamétert használni egy struktúrával:
sablonT János = 11;
T Péter = 12;
T Mária = 13;
T Öröm = 14;
;
Ezek egy évfolyam (osztály) tanulóinak életkora. Az első sor a sablon deklaráció. A zárójelben lévő test a sablon tényleges meghatározása. Az életkorok a main () függvényben adhatók meg az alábbiakkal:
Korokcout << grade7.John << " << grade7.Mary << '\n';
A kimenet: 11 13. Az első állítás itt végzi a specializációt. Vegye figyelembe, hogyan készült. Nevet ad a struct objektumának is: grade7. A második állítás rendes struktúra objektum kifejezéseket tartalmaz. A struktúra olyan, mint egy osztály. Itt az Ages olyan, mint egy osztály neve, míg a 7. osztály az osztály objektuma (struktúra).
Ha egyes korok egész számok, mások lebegők, akkor a struktúrának két általános paraméterre van szüksége, az alábbiak szerint:
sablonT János = 11;
U Péter = 12.3;
T Mária = 13;
U Öröm = 14.6;
;
A main () függvény releváns kódja a következő:
Korokcout << grade7.John << " << grade7.Peter << '\n';
A kimenet: 11 12.3. A specializációnál a típusok (argumentumok) sorrendjének meg kell felelnie a deklarációban szereplő általános típusok sorrendjének.
A sablon deklaráció az alábbiak szerint választható el a definíciótól:
sablonT János;
U Péter;
T Mária;
U Öröm;
;
Korok
Az első kódszegmens pusztán egy sablon deklarációja (nincs hozzárendelés). A második kódszegmens, amely csak utasítás, az azonosító, a grade7 meghatározása. A bal oldal az azonosító, a 7. fokozat deklarációja. A jobb oldali az inicializáló lista, amely hozzárendeli a megfelelő értékeket a struktúra tagokhoz. A második szegmens (utasítás) a main () függvénybe írható, míg az első szegmens a main () függvényen kívül marad.
Nem típus
Példák a nem adattípusokra: int, pointer to object, pointer to function és auto type. Vannak más nem típusok, amelyekkel ez a cikk nem foglalkozik. A nem típus olyan, mint egy hiányos típus, amelynek értékét később adják meg, és nem változtatható meg. Paraméterként egy adott nem típussal kezdődik, amelyet egy azonosító követ. Az azonosító értékét később adjuk meg, szakosodáskor, és nem változtatható meg újra (mint egy állandó, amelynek értékét később adjuk meg). A következő program ezt szemlélteti:
#includenévtér használata std;
sablon
T János = N;
U Péter = 12.3;
T Mary = N;
U Öröm = 14.6;
;
int main ()
Korok
cout << grade7.John << " << grade7.Joy << '\n';
visszatér 0;
A szakosodásnál az első típusú, int, a szögletes zárójelben inkább a formalitás, annak biztosítása, hogy a paraméterek száma és sorrendje megfeleljen a típusok (argumentumok) számának és sorrendjének. Az N értékét a szakirányon adtuk meg. A kimenet: 11 14.6.
Részleges specializáció
Tegyük fel, hogy egy sablonnak négy általános típusa van, és hogy a négy típus között két alapértelmezett típusra van szükség. Ez a részleges specializációs konstrukcióval érhető el, amely nem használja a hozzárendelés operátorát. Tehát a részleges specializációs konstrukció alapértelmezett értékeket ad az általános típusok egy részének. A részleges specializációs sémában azonban alaposztályra (struktúra) és részleges szakosztályra (struktúrára) van szükség. A következő program ezt szemlélteti a két általános típus közül egy általános típus esetében:
#includenévtér használata std;
// alapsablon osztály
sablon
strukturált korok
;
// részleges specializáció
sablon
strukturált korok
T1 János = 11;
úszó Péter = 12.3;
T1 Mária = 13;
úszó Öröm = 14.6;
;
int main ()
Korok
cout << grade7.John << " << grade7.Joy << '\n';
visszatér 0;
Határozza meg az alaposztály deklarációt és annak részleges osztálydefinícióját. Az alaposztály sablon-fej deklarációja tartalmazza az összes szükséges általános paramétert. A részleges szakosztály sablon-fej deklarációja csak általános típust tartalmaz. A sémában van egy további szögletes zárójel, amely a részleges specializáció definíciójában közvetlenül az osztály neve után következik. A részleges specializáció valójában ez. Ennek alapértelmezett és nem alapértelmezett típusa van, az alaposztályba írt sorrendben. Ne feledje, hogy az alapértelmezett típus továbbra is adhat más típust a main () függvényben.
A main () függvény vonatkozó kódja a következő lehet:
Korokcout << grade7.John << " << grade7.Joy << '\n';
A kimenet: 11 14.6.
Sablonparaméter-csomag
A paramétercsomag olyan sablonparaméter, amely nulla vagy több általános sablontípust fogad el a megfelelő adattípusokhoz. A paramétercsomag paraméter a fenntartott typename vagy class szóval kezdődik. Ezt követi három pont, majd a csomag azonosítója. A következő program bemutatja, hogyan használható egy sablonparaméter-csomag egy struktúrával:
#includenévtér használata std;
sablon
int János = 11;
úszó Péter = 12.3;
int Mária = 13;
úszó Öröm = 14.6;
;
int main ()
Korok
cout << gradeB.John << " << gradeB.Mary << '\n';
Korok
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Korok
cout << gradeD.John << " << gradeD.Joy << '\n';
Korosztályok> A fokozat; // mint alapértelmezett
cout << gradeA.John << " << gradeA.Joy << '\n';
visszatér 0;
A kimenet:
11 1312.3 14.6
11 14.6
11 14.6
Funkciósablonok
A fent említett sablonfunkciók hasonló módon vonatkoznak a függvénysablonokra. A következő program két általános sablonparamétert és három argumentumot mutat be:
#includenévtér használata std;
sablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
visszatér 0;
A kimenet a következő:
12 üzlet van 500 dollár értékben a boltban.
Elválasztás a prototípustól
A függvény meghatározása elválasztható prototípusától, amint azt a következő program mutatja:
#includenévtér használata std;
sablon
sablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
visszatér 0;
Megjegyzés: A függvénysablon-deklaráció nem jelenhet meg a main () vagy bármely más függvényben.
Túlterhelés
Ugyanazon függvény túlterhelése különböző sablon-fej deklarációkkal történhet. A következő program ezt szemlélteti:
#includenévtér használata std;
sablon
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
sablon
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int main ()
func (12, '$', "500");
func (12, "500");
visszatér 0;
A kimenet:
12 üzlet van 500 dollár értékben a boltban.
12 üzlet van 500 dollár értékben a boltban.
Osztálysablonok
A sablonok fent említett tulajdonságai az osztálysablonokhoz hasonlóan érvényesek. A következő program egy egyszerű osztály deklarálása, meghatározása és használata:
#includenévtér használata std;
osztály TheCla
nyilvános:
int szám;
statikus char ch;
void func (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statikus üresség (char ch)
ha (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla obj;
obj.szám = 12;
obj.func ('$', "500");
visszatér 0;
A kimenet a következő:
12 üzlet van 500 dollár értékben a boltban.
A következő program a fenti program, sablon-fej deklarációval:
#includenévtér használata std;
sablon
nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statikus üresség (U ch)
ha (ch == 'a')
cout << "Official static member function" << '\n';
;
int main ()
TheCla
obj.szám = 12;
obj.func ('$', "500");
visszatér 0;
A sablonparaméter-listában a typename szó helyett a szóosztály használható. Vegye figyelembe a szakterületet az objektum deklarációjában. A kimenet továbbra is ugyanaz:
12 üzlet van 500 dollár értékben a boltban.
Külön nyilatkozat
Az osztálysablon-deklaráció az alábbiak szerint választható el az osztálykódtól:
sablonsablon
nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statikus üresség (U ch)
ha (ch == 'a')
cout << "Official static member function" << '\n';
;
Statikus tagok kezelése
A következő program bemutatja, hogyan lehet elérni egy statikus adattagot és egy statikus tagfüggvényt:
#includenévtér használata std;
sablon
nyilvános:
T szám;
statikus U ch;
void func (U cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
statikus üresség (U cha)
ha (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
sablon
int main ()
TheCla
visszatér 0;
Az érték hozzárendelése egy statikus adattaghoz deklaráció és nem lehet fő (). Jegyezze fel a hozzárendelési utasításban az általános típusok és az általános adattípusok használatát és pozícióit. Ezenkívül vegye figyelembe, hogy a statikus adattag függvény meghívásra került a main () -ban, a tényleges sablon adattípusokkal együtt. A kimenet a következő:
Hivatalos statikus tag funkció.
Összeállítás
A deklarációnak (fejlécnek) és a sablon definíciójának egy fájlban kell lennie. Vagyis ugyanabban a fordítási egységben kell lenniük.
Következtetés
A C ++ sablonok algoritmust készítenek a felhasznált adatok típusától. A változó, függvény, struktúra és osztály entitásai lehetnek sablonokkal, amelyek deklarációt és definíciót tartalmaznak. A sablon létrehozása magában foglalja a specializálódást is, amikor az általános típus tényleges típust vesz fel. A deklarációnak és a sablon meghatározásának egyaránt egy fordítási egységben kell lennie.