|
|
10 2.5 |
operatie, dar una dintre ele are doi parametri de tip int, în timp ce cealaltă are doi parametri de tip double. Compilatorul știe pe care dintre ele să o apeleze analizând tipurile transmise ca argumente la apelul funcției. Dacă este apelată cu două argumente de tip int, se va executa acea funcție care are parametrii int, iar dacă este apelată cu două valori de tip double, se va executa funcția definită cu parametri de tip double.int înmulțește argumentele, în timp ce versiunea cu double le împarte. Aceasta nu este o idee prea bună, în general. De obicei, se așteaptă ca două funcții cu acelasi nume să aibă un comportament asemănător - cel puțin, dar acest exemplu arată că se poate și altfel. Două funcții surpaîncărcate (adică două funcții cu același nume) au definiții complet diferite; întotdeauna, ele sunt două funcții diferite, pentru care doar numele este la fel. |
|
30 2.5 |
suma este supraîncărcată cu parametri de tipuri diferite, dar are exact același corp.suma ar putea fi supraîncărcată pentru o mulțime de tipuri și tot ar avea sens să își păstreze același corp. Pentru asemenea cazuri, C++ are aabilitatea de a permite definirea de funcții cu tipuri generice, prin ceea ce numim șabloane de funcții. Definirea unui șablon de funcții respectă aceeași sintaxă ca și definirea obișnuită a unei funcții, doar că este precedată de cuvântul cheie template și de o serie de șabloane de parametri incluse între paranteze unghiulare <>:template <sablon-parametri> declaratie-functie
class sau nume_tip urmat de un identificator. Acest identificator poate fi folosit ulterior în declarația funcției ca un tip de dată obișnuit. De exemplu, o funcție generică suma ar putea fi definită astfel: |
|
class sau cu nume_tip (ele sunt sinonime 100% în șablonul de declarații).unTip (un tip generic în șablonul de parametri inclus între paranteze unghiulare) permite ca unTip să fie folosit oriunde în definiția funcției, ca orice alt tip; el poate fi folosit ca tip pentru parametri, ca tip returnat sau pentru a declara noi variabile cu acest tip. Întotdeauna, el reprezintă un tip generic ce va fi determinat în momentul ăn care se va instanția șablonul.nume <argumente-sablon> (argumente-functie)
suma definit mai sus poate fi apelat astfel: |
|
suma<int> este doar una dintre posibilele instanțieri ale șablonului de funcție suma. În acest caz, la folosirea lui int în apel, compilatorul creează automat o versiune a funcției suma în care apariția lui unTip este înlocuită cu int, ca și cum ar fi fost definită astfel: |
|
|
|
11 2.5 |
T ca nume de parametru-șablon, în loc de unTip. Nu are importanță, căci T este tot un nume de parametru-șablon pentru tipurile generice. suma de două ori. Prima dată cu argumente de tip int, iar a doua oară cu argumente de tip double. Compilatorul a instanțiat și, apoi, a apelat, de fiecare dată, versiunea potrivită de funcție.T este folosit și pentru a declara o variabilă locală cu acel tip (generic) în interiorul funcției suma: |
|
a și b; la fel și tipul returnat de funcție.T este folosit ca parametru pentru suma, compilatorul chiar este capabil să deducă automat tipul de date, fără să fie necesară precizarea explicită în interiorul parantezelor unghiulare. De aceea, în loc de explicitarea argumentelor șablonului cu: |
|
|
|
T, dacă suma este apelată cu argumente de tipuri diferite. |
|
x si y sunt egale |
sunt_egale: |
|
|
|
10) sunt întotdeauna de tip int, iar constantele reale fără sufix (precum 10.0) sunt întotdeauna de tip double, nu există ambiguitate și, de aceea, argumentele șablon pot fi omise la apel.class sau nume_tip, ci și expresii de un anumit tip: |
|
20 30 |
inmultire_fixa este de tip int. Arată exact ca un parametru de funcție obișnuit, deci poate fi folosit tot așa.inmultire_fixa. Așadar, valoarea unui asemenea parametru nu este niciodată transmisă în timpul rulării programului. Cele două apeluri ale lui inmultire_fixa din main apelează două versiuni ale funcției: una care dublează, respectiv una care triplează. Exact pentru acest motiv, al doilea argument din șablon trebuie să fie o expresie constantă (nu se poate transmite o variabilă).Funcții | Index | Vizibilitatea numelor |