În acest articol, veți afla despre șabloane în C ++. Veți învăța să utilizați puterea șabloanelor pentru programarea generică.
Șabloanele sunt caracteristici puternice ale C ++, care vă permite să scrieți programe generice. În termeni simpli, puteți crea o singură funcție sau o clasă pentru a lucra cu diferite tipuri de date folosind șabloane.
Șabloanele sunt adesea utilizate într-o bază de cod mai mare în scopul reutilizării codului și a flexibilității programelor.
Conceptul de șabloane poate fi utilizat în două moduri diferite:
- Șabloane de funcții
- Șabloane de clasă
Șabloane de funcții
Un șablon de funcție funcționează într-o funcție similară cu o funcție normală, cu o diferență de cheie.
Un singur șablon de funcție poate funcționa simultan cu diferite tipuri de date, dar o singură funcție normală poate funcționa numai cu un singur set de tipuri de date.
În mod normal, dacă trebuie să efectuați operațiuni identice pe două sau mai multe tipuri de date, utilizați supraîncărcarea funcției pentru a crea două funcții cu declarația de funcție necesară.
Cu toate acestea, o abordare mai bună ar fi utilizarea șabloanelor de funcții, deoarece puteți efectua aceeași sarcină scriind cod mai puțin și care poate fi întreținut.
Cum să declarați un șablon de funcție?
Un șablon de funcție începe cu șablonul de cuvinte cheie urmat de parametrii șablonului în care este urmat de declarația de funcție.
template < class T> T someFunction (T arg) (…)
În codul de mai sus, T este un argument șablon care acceptă diferite tipuri de date (int, float), iar clasa este un cuvânt cheie.
De asemenea, puteți utiliza cuvântul cheie typename
în loc de clasă în exemplul de mai sus.
Când, un argument al unui tip de date este transmis către someFunction( )
, compilatorul generează o nouă versiune a someFunction()
pentru tipul de date dat.
Exemplul 1: Șablon de funcții pentru a găsi cel mai mare număr
Program pentru a afișa cel mai mare dintre două numere folosind șabloane de funcții.
// If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )
Ieșire
Introduceți două numere întregi: 5 10 10 este mai mare. Introduceți două numere în virgulă mobilă: 12,4 10,2 12,4 este mai mare. Introduceți două caractere: z Z z are o valoare ASCII mai mare.
În programul de mai sus, Large()
este definit un șablon de funcție care acceptă două argumente n1 și n2 de tip date T
. T
înseamnă că argumentul poate fi de orice tip de date.
Large()
funcția returnează cel mai mare dintre cele două argumente folosind o operație condițională simplă.
In interiorul main()
functiei, variabile de trei tipuri de date diferite: int
, float
și char
sunt declarate. Variabilele sunt apoi transmise Large()
șablonului de funcții ca funcții normale.
În timpul rulării, când un număr întreg este trecut la funcția șablon, compilatorul știe că trebuie să genereze o Large()
funcție pentru a accepta argumentele int și o face.
În mod similar, atunci când sunt transmise date în virgulă mobilă și date char, acesta cunoaște tipurile de date ale argumentului și generează Large()
funcția în consecință.
În acest fel, utilizarea unui singur șablon de funcție a înlocuit trei funcții normale identice și a făcut ca codul dvs. să fie menținut.
Exemplul 2: Schimbați datele folosind șabloane funcționale
Program pentru a schimba date folosind șabloane de funcții.
#include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; )
Ieșire
Înainte de a trece date la șablonul funcțional. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b După trecerea datelor la șablonul funcțional. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
În acest program, în loc să apelați o funcție prin trecerea unei valori, este emis un apel prin referință.
Swap()
Șablonul Funcția are două argumente și le swap - urile de referință.
Șabloane de clasă
La fel ca șabloanele de funcții, puteți crea și șabloane de clasă pentru operații de clasă generice.
Uneori, aveți nevoie de o implementare a clasei care este aceeași pentru toate clasele, doar tipurile de date utilizate sunt diferite.
În mod normal, ar trebui să creați o clasă diferită pentru fiecare tip de date SAU să creați variabile și funcții membre diferite într-o singură clasă.
Acest lucru vă va umfla inutil baza de cod și va fi greu de întreținut, deoarece o schimbare este o clasă / funcție care trebuie efectuată pe toate clasele / funcțiile.
Cu toate acestea, șabloanele de clasă facilitează reutilizarea aceluiași cod pentru toate tipurile de date.
Cum să declarați un șablon de clasă?
template < class T> class className (… public: T var; T someOperation (T arg); …);
În declarația de mai sus, T
este argumentul șablon care este un substituent pentru tipul de date utilizat.
În interiorul corpului clasei, o variabilă membru var și o funcție membru someOperation()
sunt ambele de tip T
.
Cum se creează un obiect șablon de clasă?
Pentru a crea un obiect șablon de clasă, trebuie să definiți tipul de date din interiorul unei la crearea.
className classObject;
De exemplu:
className classObject; className classObject; className classObject;
Exemplul 3: Calculator simplu folosind șablonul de clasă
Programați pentru a adăuga, scădea, înmulți și împărți două numere folosind șablonul clasei
#include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; )
Ieșire
Rezultate Int: Numerele sunt: 2 și 1. Adunarea este: 3 Scăderea este: 1 Produsul este: 2 Diviziunea este: 2 Rezultate plutitoare: Numerele sunt: 2.4 și 1.2. Adunarea este: 3.6 Scăderea este: 1.2 Produsul este: 2.88 Diviziunea este: 2
În programul de mai sus, Calculator
este declarat un șablon de clasă .
Clasa conține doi membri privați de tip T
: num1 și num2 și un constructor pentru a inițializa membrii.
De asemenea, conține funcții de membru public pentru a calcula adunarea, scăderea, înmulțirea și divizarea numerelor care returnează valoarea tipului de date definită de utilizator. La fel, o funcție displayResult()
pentru a afișa ieșirea finală pe ecran.
În main()
funcție, două diferite Calculator
obiecte intCalc
și floatCalc
sunt create pentru tipuri de date: int
și , float
respectiv. Valorile sunt inițializate folosind constructorul.
Observați că folosim și în
timp ce creăm obiectele. Acestea spun compilatorului tipul de date utilizat pentru crearea clasei.
Aceasta creează o definiție a clasei pentru fiecare int
și float
, care sunt apoi utilizate în mod corespunzător.
Apoi, displayResult()
se numește ambele obiecte care efectuează operațiile Calculator și afișează ieșirea.