V tem članku boste izvedeli več o predlogah v jeziku C ++. Naučili se boste uporabljati moč predlog za generično programiranje.
Predloge so zmogljive funkcije C ++, ki vam omogoča pisanje generičnih programov. Preprosto povedano, lahko ustvarite eno funkcijo ali razred za delo z različnimi tipi podatkov s pomočjo predlog.
Predloge se pogosto uporabljajo v večji programski bazi za večkratno uporabo in prilagodljivost programov.
Koncept predlog se lahko uporablja na dva različna načina:
- Predloge funkcij
- Predloge za predavanja
Predloge funkcij
Predloga funkcije deluje podobno kot običajna funkcija z eno ključno razliko.
Predloga ene funkcije lahko deluje hkrati z različnimi tipi podatkov, vendar lahko ena običajna funkcija deluje samo z enim nizom podatkovnih tipov.
Če morate na dveh ali več vrstah podatkov izvesti enake operacije, s preobremenitvijo funkcije ustvarite dve funkciji z zahtevano izjavo funkcije.
Vendar bi bil boljši pristop uporaba predloge funkcij, ker lahko isto nalogo zapišete manj in vzdržno kodo.
Kako prijaviti predlogo funkcije?
Predloga funkcije se začne s predlogo ključne besede, ki ji sledijo parametri / s predloge, ki ji sledi izjava funkcije.
predloga < razred T> T someFunction (T arg) (…)
V zgornji kodi je T argument predloge, ki sprejema različne vrste podatkov (int, float), razred pa je ključna beseda.
typename
Namesto razreda lahko v zgornjem primeru uporabite tudi ključno besedo .
Ko se argumentu podatkovnega tipa posreduje someFunction( )
, prevajalnik ustvari novo različico someFunction()
za dani podatkovni tip.
Primer 1: Predloga funkcije za iskanje največjega števila
Program za prikaz največjih med dvema številkama s pomočjo funkcijskih predlog.
// 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; )
Izhod
Vnesite dve celi števili: 5 10 10 je večje. Vnesite dve številki s plavajočo vejico: 12,4 10,2 12,4 je večje. Vnesite dva znaka: z Z z ima večjo vrednost ASCII.
V zgornjem programu Large()
je definirana predloga funkcije, ki sprejme dva argumenta n1 in n2 podatkovnega tipa T
. T
pomeni, da je lahko argument katere koli podatkovne vrste.
Large()
funkcija vrne največjega med obema argumentoma s preprosto pogojno operacijo.
Znotraj main()
funkcije, spremenljivke tri različne vrste podatkov: int
, float
in char
se prijavi. Nato se spremenljivke posredujejo v Large()
predlogo funkcije kot običajne funkcije.
Med izvajanjem, ko se celo število prenese v funkcijo predloge, prevajalnik ve, da mora ustvariti Large()
funkcijo za sprejem argumentov int, in to stori.
Podobno, ko se posredujejo podatki s plavajočo vejico in podatki char, pozna tipe podatkov argumenta in ustrezno generira Large()
funkcijo.
Tako je samo ena predloga funkcije nadomestila tri enake običajne funkcije in omogočila vzdrževanje kode.
Primer 2: Zamenjajte podatke s pomočjo funkcijskih predlog
Program za zamenjavo podatkov s pomočjo funkcijskih predlog.
#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; )
Izhod
Preden podatke prenesete v predlogo funkcije. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Po posredovanju podatkov v predlogo funkcije. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
V tem programu se namesto klica funkcije s predajo vrednosti izda klic s sklicem.
Swap()
Predloga funkcija ima dva argumenta in jih zamenjave z referenco.
Predloge za predavanja
Tako kot predloge funkcij lahko tudi za generične operacije razredov ustvarite predloge razredov.
Včasih potrebujete izvedbo razreda, ki je enaka za vse razrede, le uporabljeni tipi podatkov so različni.
Običajno bi morali za vsak podatkovni tip ustvariti drugačen razred ALI v enem razredu ustvariti različne spremenljivke in funkcije članov.
To bo po nepotrebnem napihnilo vašo kodno podlago in jo bo težko vzdrževati, saj je sprememba ena razred / funkcija, ki jo je treba izvesti za vse razrede / funkcije.
Predloge razredov pa olajšajo ponovno uporabo iste kode za vse vrste podatkov.
Kako razglasiti predlogo razreda?
template < class T> class className (… public: T var; T someOperation (T arg);…);
V zgornji izjavi T
je argument predloge, ki je ograda za uporabljeni tip podatkov.
Znotraj telesa razreda sta spremenljivka člana var in funkcija člana someOperation()
tipa T
.
Kako ustvariti predmet predloge razreda?
Če želite ustvariti predmet predloge razreda, morate med ustvarjanjem določiti podatkovni tip znotraj .
className classObject;
Na primer:
className classObject; className classObject; className classObject;
Primer 3: Preprost kalkulator z uporabo predloge Class
Program za seštevanje, odštevanje, množenje in deljenje dveh števil s pomočjo predloge predavanja
#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; )
Izhod
Int rezultati: Številke so: 2 in 1. Seštevanje je: 3 Odštevanje je: 1 Izdelek je: 2 Delitev je: 2 Rezultati float: Številke so: 2.4 in 1.2. Seštevanje je: 3.6 Odštevanje je: 1.2 Izdelek je: 2.88 Delitev je: 2
V zgornjem programu Calculator
je navedena predloga predavanja .
Razred vsebuje dva zasebna člana tipa T
: num1 & num2 in konstruktor za začetno uporabo članov.
Vsebuje tudi funkcije javnih članov za izračun seštevanja, odštevanja, množenja in deljenja števil, ki vrnejo vrednost podatkovnega tipa, ki ga je določil uporabnik. Prav tako funkcija displayResult()
za prikaz končnega izhoda na zaslon.
V main()
funkciji sta ustvarjena dva različna Calculator
predmeta intCalc
in floatCalc
za podatkovne tipe: int
in float
. Vrednosti se inicializirajo s pomočjo konstruktorja.
Upoštevajte, da uporabljamo in
med ustvarjanjem predmetov. Ti prevajalniku sporočajo vrsto podatkov, ki se uporablja za ustvarjanje razreda.
To ustvari definicijo razreda za int
in float
, ki se nato ustrezno uporabi.
Nato displayResult()
se pokliče oba predmeta, ki izvede kalkulator in prikaže izhodne podatke.