Selles artiklis saate teada mallide kohta C ++ keeles. Õpid kasutama mallide jõudu üldiseks programmeerimiseks.
Mallid on C ++ võimas funktsioon, mis võimaldab teil kirjutada üldisi programme. Lihtsamalt öeldes saate mallide abil luua ühe funktsiooni või klassi töötamiseks erinevate andmetüüpidega.
Malle kasutatakse koodide korduvkasutatavuse ja programmide paindlikkuse huvides sageli suuremas koodibaasis.
Mallide kontseptsiooni saab kasutada kahel erineval viisil:
- Funktsioonimallid
- Klassi mallid
Funktsioonimallid
Funktsioonimall töötab sarnaselt tavalisele funktsioonile, ühe võtme erinevusega.
Üks funktsioonimall võib töötada korraga erinevate andmetüüpidega, kuid üks tavaline funktsioon saab töötada ainult ühe andmetüüpide komplektiga.
Tavaliselt, kui peate kahe või enama tüüpi andmetega tegema identseid toiminguid, kasutate funktsiooni ülekoormamist, et luua kaks funktsiooni koos vajaliku funktsioonideklaratsiooniga.
Parem lähenemisviis oleks siiski funktsioonimallide kasutamine, sest saate sama ülesande täita kirjutades vähem ja hooldatavat koodi.
Kuidas deklareerida funktsioonimalli?
Funktsioon malli algab märksõna malli järgneb malliparameeter / s sees , mis järgneb funktsiooni deklaratsiooni.
mall < klass T> T someFunction (T arg) (…)
Ülaltoodud koodis on T malli argument, mis aktsepteerib erinevaid andmetüüpe (int, float) ja klass on märksõna.
typename
Ülalolevas näites saate klassi asemel kasutada ka märksõna .
Kui edastatakse andmetüübi argument someFunction( )
, loob kompilaator someFunction()
antud andmetüübile uue versiooni .
Näide 1: Funktsioonimall suurima arvu leidmiseks
Funktsioonimallide abil saate kuvada kahe numbri vahel suurima.
// 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; )
Väljund
Sisestage kaks täisarvu: 5 10 10 on suurem. Sisestage kaks ujukomaarvu: 12,4 10,2 12,4 on suurem. Sisestage kaks märki: z Z z-l on suurem ASCII-väärtus.
Ülalolevas programmis Large()
on määratletud funktsioonimall, mis aktsepteerib kahte andmetüübi argumenti n1 ja n2 T
. T
tähistab, et see argument võib olla mis tahes tüüpi.
Large()
funktsioon tagastab lihtsa tingimusliku toimingu abil kahest argumendist suurima.
Sees main()
funktsiooni muutujate kolme erineva andmetüübid: int
, float
ja char
on deklareeritud. Seejärel edastatakse muutujad Large()
funktsioonimallile tavaliste funktsioonidena.
Käitusaja jooksul, kui mallfunktsioonile edastatakse täisarv, teab kompilaator, et ta peab Large()
int-argumentide aktsepteerimiseks genereerima funktsiooni ja teeb seda.
Samamoodi teab ujukomaandmete ja söeandmete edastamisel argumentide andmetüüpe ja genereerib Large()
vastavalt sellele funktsiooni.
Nii asendas ainult ühe funktsioonimalli kasutamine kolm identset tavalist funktsiooni ja muutis teie koodi hooldatavaks.
Näide 2: andmete vahetamine funktsioonimallide abil
Programm andmete vahetamiseks funktsioonimallide abil.
#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; )
Väljund
Enne andmete edastamist funktsioonimalli. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Pärast andmete edastamist funktsioonimalli. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
Selles programmis väljastatakse funktsiooni kutsumine väärtuse edastamise asemel viide.
Swap()
Funktsiooni malli kaht argumenti ja vahetab need viitena.
Klassi mallid
Nagu funktsioonimallid, saate ka klassi üldiste toimingute jaoks luua klassimallid.
Mõnikord vajate klassi rakendamist, mis oleks kõigi klasside jaoks sama, erinevad ainult kasutatavad andmetüübid.
Tavaliselt peate iga andmetüübi jaoks looma erineva klassi VÕI looma ühe klassi erinevad liikme muutujad ja funktsioonid.
See paisutab teie koodibaasi asjatult ja seda on raske hooldada, kuna muudatus on üks klass / funktsioon, mida tuleks teha kõikides klassides / funktsioonides.
Klassimallide abil on sama koodi taaskasutamine kõigi andmetüüpide jaoks aga lihtne.
Kuidas klassi malli deklareerida?
mall < class T> class className (… public: T var; T someOperation (T arg);…);
Kas ülaltoodud deklaratsioonis T
on malli argument, mis on kasutatud andmetüübi kohatäide.
Klassikehas someOperation()
on mõlemad liikmuutuja var ja liikmefunktsioonid T
.
Kuidas luua klassi malli objekti?
Klassimalli objekti loomiseks peate loomisel määratlema andmetüübi a sees .
className classObject;
Näiteks:
className classObject; className classObject; className classObject;
Example 3: Simple calculator using Class template
Program to add, subtract, multiply and divide two numbers using class template
#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; )
Output
Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2
In the above program, a class template Calculator
is declared.
The class contains two private members of type T
: num1 & num2, and a constructor to initalize the members.
It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult()
to display the final output to the screen.
In the main()
function, two different Calculator
objects intCalc
and floatCalc
are created for data types: int
and float
respectively. The values are initialized using the constructor.
Notice we use and
while creating the objects. These tell the compiler the data type used for the class creation.
This creates a class definition each for int
and float
, which are then used accordingly.
Seejärel displayResult()
nimetatakse mõlemat objekti, mis täidab kalkulaatori toiminguid ja kuvab väljundi.