Šajā rakstā jūs uzzināsit par veidnēm C ++. Jūs iemācīsities izmantot veidņu spēku vispārīgai programmēšanai.
Veidnes ir spēcīgas C ++ funkcijas, kas ļauj rakstīt vispārīgas programmas. Vienkārši sakot, izmantojot veidnes, varat izveidot vienu funkciju vai klasi darbam ar dažādiem datu tipiem.
Veidnes bieži tiek izmantotas lielākā koda bāzē, lai izmantotu kodu atkārtotu lietošanu un programmu elastību.
Veidņu koncepciju var izmantot divējādi:
- Funkciju veidnes
- Klases veidnes
Funkciju veidnes
Funkciju veidne darbojas līdzīgi parastajai funkcijai ar vienu taustiņu atšķirību.
Viena funkcijas veidne var darboties vienlaikus ar dažādiem datu tipiem, bet viena parasta funkcija var darboties tikai ar vienu datu veidu kopu.
Parasti, ja jums ir jāveic identiskas darbības ar diviem vai vairākiem datu veidiem, jūs izmantojat funkciju pārslodzi, lai izveidotu divas funkcijas ar nepieciešamo funkciju deklarāciju.
Tomēr labāka pieeja būtu funkciju veidņu izmantošana, jo jūs varat veikt to pašu uzdevumu, rakstot mazāk un uzturējamu kodu.
Kā deklarēt funkciju veidni?
Funkcijas veidne sākas ar atslēgvārda veidni, kam seko veidnes parametrs / s, kam seko funkcijas deklarācija.
veidne < klase T> T someFunction (T arg) (…)
Iepriekš minētajā kodā T ir veidnes arguments, kas pieņem dažādus datu tipus (int, float), un klase ir atslēgvārds.
typename
Iepriekš minētajā piemērā klases vietā klases vietā varat izmantot arī atslēgvārdu .
Kad tiek pārsūtīts datu tipa arguments someFunction( )
, kompilators ģenerē someFunction()
norādītajam datu tipam jaunu versiju .
1. piemērs: Funkciju veidne, lai atrastu lielāko skaitli
Programma, lai parādītu lielāko no diviem skaitļiem, izmantojot funkciju veidnes.
// 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; )
Rezultāts
Ievadiet divus skaitļus: 5 10 10 ir lielāks. Ievadiet divus peldošā komata skaitļus: 12,4 10,2 12,4 ir lielāks. Ievadiet divas rakstzīmes: z Z z ir lielāka ASCII vērtība.
Iepriekš minētajā programmā Large()
tiek definēta funkcijas veidne, kas pieņem divus datu veida argumentus n1 un n2 T
. T
nozīmē, ka arguments var būt jebkura veida dati.
Large()
funkcija atgriež lielāko starp diviem argumentiem, izmantojot vienkāršu nosacītu darbību.
Inside main()
funkcijas, mainīgie trīs dažādiem datu veidiem: int
, float
un char
tiek atzīts. Pēc tam mainīgie tiek pārsūtīti uz Large()
funkciju veidni kā parastās funkcijas.
Ekspluatācijas laikā, kad veidnes funkcijai tiek nodots vesels skaitlis, kompilators zina, ka tai ir jāizveido Large()
funkcija, lai akceptētu int argumentus, un to dara.
Līdzīgi, kad tiek nodoti peldošā komata un char dati, tā zina argumentu datu tipus un attiecīgi ģenerē Large()
funkciju.
Tādējādi tikai vienas funkcijas veidnes izmantošana aizstāja trīs identiskas parastās funkcijas un padarīja jūsu kodu uzturamu.
2. piemērs: Apmainiet datus, izmantojot funkciju veidnes
Programma datu apmaiņai, izmantojot funkciju veidnes.
#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; )
Rezultāts
Pirms datu nodošanas funkciju veidnei. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Pēc datu nodošanas funkciju veidnei. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
Šajā programmā tā vietā, lai izsauktu funkciju, nododot vērtību, tiek izsaukts atsauce.
Swap()
Funkcija veidne aizņem divus argumentus un mijmaiņas darījumus uz tiem.
Klases veidnes
Tāpat kā funkciju veidnes, varat arī izveidot klases veidnes vispārīgām klases darbībām.
Dažreiz jums ir nepieciešama klases ieviešana, kas visām klasēm ir vienāda, atšķiras tikai izmantotie datu tipi.
Parasti katram datu tipam jums jāizveido atšķirīga klase VAI vienā klasē jāizveido dažādi dalībnieku mainīgie un funkcijas.
Tas nevajadzīgi uzpūtīs jūsu koda bāzi un to būs grūti uzturēt, jo izmaiņas ir viena klase / funkcija, kas jāveic visām klasēm / funkcijām.
Tomēr klases veidnes atvieglo viena un tā paša koda atkārtotu izmantošanu visiem datu tipiem.
Kā deklarēt klases veidni?
veidne < class T> class className (… public: T var; T someOperation (T arg);…);
Iepriekš minētajā deklarācijā T
ir veidnes arguments, kas ir izmantotā datu veida vietturis.
Klases pamattekstā locekļa mainīgais var un locekļa funkcija someOperation()
ir viena veida T
.
Kā izveidot klases veidnes objektu?
Lai izveidotu klases veidnes objektu, izveidošanas laikā jānosaka datu tips a iekšpusē .
className classObject;
Piemēram:
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.
Pēc tam displayResult()
tiek saukts par abiem objektiem, kas veic kalkulatora darbības un parāda izvadi.