[ Pobierz całość w formacie PDF ]
.typami i/lub liczb¹ argumentów.Sk³adnia jêzyka C++ dopuszcza taki sposób deklarowania i definiowania funkcji; nazywa siê go przeci¹¿eniem nazwy funkcji lub krócej przeci¹¿eniem funkcji.Obowi¹zuj¹ przy tym nastêpuj¹ce zasady:Funkcje przeci¹¿one (o takiej samej nazwie) musz¹ mieæ taki sam zasiêg (np.bloku, pliku, programu).Funkcje, które ró¿ni¹ siê tylko typem zwracanym, nie mog¹ mieæ takiej samej nazwy.Funkcje o takiej samej nazwie musz¹ siê ró¿niæ sygnaturami i mog¹ siê ró¿niæ typem zwracanym.Je¿eli argumenty dwóch funkcji ró¿ni¹ siê tylko tym, ¿e jedna ma argument typu T, a druga T&, to funkcje te nie mog¹ mieæ takiej samej nazwy.Wynika to st¹d, ¿e zarówno T, jak i T& s¹ inicjowane tym samym zbiorem wartoœci i wywo³anie nie potrafi ich rozró¿niæ.Dwie funkcje, których argumenty ró¿ni¹ siê tylko tym, ¿e jedna ma argument typu T, a druga const T, nie mog¹ mieæ takiej samej nazwy.Przyczyna jest analogiczna, jak dla argumentów typu T i T&.Przyk³ad 5.23.#include <iostream.h>extern int min(int, int);extern double min(double, double);extern int min(int, int, int);int main() {cout << min( 2, 7 ) << endl;cout << min( 2.5, 7.5 ) << endl;cout << min( 9, 6, 4 ) << endl;return 0;}Definicje kolejnych funkcji min() mog¹ mieæ postaæ:int min( int a, int b ) { return a < b ? a : b; }double min(double x, double y){ return x < y ? x : y; }int min(int u, int v, int w){if (u < v) return u < w ? u : w;else return v < w ? v : w;}Dyskusja.W wywo³aniu min(2,7) liczba i typy argumentów aktualnych s¹ porównywane z liczb¹ i typami argumentów formalnych kolejnych prototypów funkcji min(), zadeklarowanych przed blokiem funkcji main().Po dopasowaniu przez kompilator prototypu int min(int,int) konsolidator w³¹czy do pliku z kodem wykonalnym definicjê tej funkcji.Analogicznie bêd¹ przetwarzane pozosta³e dwa wywo³ania.Tak oto wprowadziliœmy funkcje przeci¹¿one.Jest to realizacja nastêpuj¹cej zasady: jeden ogólny interfejs, wiele metod (implementacji).Funkcje przeci¹¿one zalicza siê do metod o wi¹zaniu wczesnym, poniewa¿ ca³a informacja adresowa, potrzebna do ich wywo³ania, jest znana po zakoñczeniu kompilacji.Dziêki temu wywo³ania funkcji o wi¹zaniu wczesnym (nie tylko przeci¹¿onych) nale¿¹ do najszybszych, poniewa¿ narzut czasowy, zwi¹zany z ich wywo³aniem, jest minimalny.Zauwa¿my te¿, ¿e przeci¹¿anie funkcji pozwala na rozszerzanie œrodowiska programowego C++ w miarê potrzeb.5.8.1.Dopasowanie argumentówW fazie kompilacji programu, zawieraj¹cego wywo³ania funkcji przeci¹¿onych, uruchamiana jest doœæ z³o¿ona procedura dopasowania argumentów.Procedura ta ma na celu mo¿liwie najlepsze dopasowanie argumentów wywo³ania do argumentów formalnych i w rezultacie wybranie odpowiedniej funkcji.Szukane dopasowanie ma byæ najlepsze w tym sensie, ¿e wybrana funkcja musi mieæ przynajmniej jeden argument lepiej dopasowany ni¿ ka¿da z pozosta³ych, mo¿liwych do zaakceptowania funkcji.Proces dopasowania argumentów jest to najkrótszy ci¹g przekszta³ceñ (konwersji) typu argumentu (-ów) aktualnego w typ argumentu(-ów) formalnego.W ci¹gu tym dopuszcza siê co najwy¿ej jedn¹ konwersjê jawn¹, tj.zadan¹ przez programistê.W procesie dopasowania maj¹ miejsce zestawione ni¿ej regu³y.Dopasowanie dok³adne.Typy argumentów aktualnych i formalnych s¹ te same lub przechodz¹ w siebie drog¹ konwersji trywialnych: typ T w T&, typ T& w typ T[] w T*, typ T w const T, typ T*, w const T*, typ T(argumenty) w T(*)(argumenty).Dopasowanie z promocj¹.Je¿eli nie powiedzie siê dopasowanie dok³adne, to kompilator stosuje wszelkie mo¿liwe promocje.Dla typów ca³kowitych, argumenty typu char, unsigned char, enum oraz short int, s¹ promowane do typu int.Je¿eli rozmiarsizeof(short int) <= sizeof(int),to argument typu unsigned short int jest promowany do typu int.Dla typów zmiennopozycyjnych stosowana jest specjalna promocja z float do double.Pokazane ni¿ej deklaracje funkcji przeci¹¿onych i ich wywo³ania ilustruj¹ niektóre promocje.Przyk³ad 5.24.#include <iostream [ Pobierz caÅ‚ość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl trzylatki.xlx.pl
.typami i/lub liczb¹ argumentów.Sk³adnia jêzyka C++ dopuszcza taki sposób deklarowania i definiowania funkcji; nazywa siê go przeci¹¿eniem nazwy funkcji lub krócej przeci¹¿eniem funkcji.Obowi¹zuj¹ przy tym nastêpuj¹ce zasady:Funkcje przeci¹¿one (o takiej samej nazwie) musz¹ mieæ taki sam zasiêg (np.bloku, pliku, programu).Funkcje, które ró¿ni¹ siê tylko typem zwracanym, nie mog¹ mieæ takiej samej nazwy.Funkcje o takiej samej nazwie musz¹ siê ró¿niæ sygnaturami i mog¹ siê ró¿niæ typem zwracanym.Je¿eli argumenty dwóch funkcji ró¿ni¹ siê tylko tym, ¿e jedna ma argument typu T, a druga T&, to funkcje te nie mog¹ mieæ takiej samej nazwy.Wynika to st¹d, ¿e zarówno T, jak i T& s¹ inicjowane tym samym zbiorem wartoœci i wywo³anie nie potrafi ich rozró¿niæ.Dwie funkcje, których argumenty ró¿ni¹ siê tylko tym, ¿e jedna ma argument typu T, a druga const T, nie mog¹ mieæ takiej samej nazwy.Przyczyna jest analogiczna, jak dla argumentów typu T i T&.Przyk³ad 5.23.#include <iostream.h>extern int min(int, int);extern double min(double, double);extern int min(int, int, int);int main() {cout << min( 2, 7 ) << endl;cout << min( 2.5, 7.5 ) << endl;cout << min( 9, 6, 4 ) << endl;return 0;}Definicje kolejnych funkcji min() mog¹ mieæ postaæ:int min( int a, int b ) { return a < b ? a : b; }double min(double x, double y){ return x < y ? x : y; }int min(int u, int v, int w){if (u < v) return u < w ? u : w;else return v < w ? v : w;}Dyskusja.W wywo³aniu min(2,7) liczba i typy argumentów aktualnych s¹ porównywane z liczb¹ i typami argumentów formalnych kolejnych prototypów funkcji min(), zadeklarowanych przed blokiem funkcji main().Po dopasowaniu przez kompilator prototypu int min(int,int) konsolidator w³¹czy do pliku z kodem wykonalnym definicjê tej funkcji.Analogicznie bêd¹ przetwarzane pozosta³e dwa wywo³ania.Tak oto wprowadziliœmy funkcje przeci¹¿one.Jest to realizacja nastêpuj¹cej zasady: jeden ogólny interfejs, wiele metod (implementacji).Funkcje przeci¹¿one zalicza siê do metod o wi¹zaniu wczesnym, poniewa¿ ca³a informacja adresowa, potrzebna do ich wywo³ania, jest znana po zakoñczeniu kompilacji.Dziêki temu wywo³ania funkcji o wi¹zaniu wczesnym (nie tylko przeci¹¿onych) nale¿¹ do najszybszych, poniewa¿ narzut czasowy, zwi¹zany z ich wywo³aniem, jest minimalny.Zauwa¿my te¿, ¿e przeci¹¿anie funkcji pozwala na rozszerzanie œrodowiska programowego C++ w miarê potrzeb.5.8.1.Dopasowanie argumentówW fazie kompilacji programu, zawieraj¹cego wywo³ania funkcji przeci¹¿onych, uruchamiana jest doœæ z³o¿ona procedura dopasowania argumentów.Procedura ta ma na celu mo¿liwie najlepsze dopasowanie argumentów wywo³ania do argumentów formalnych i w rezultacie wybranie odpowiedniej funkcji.Szukane dopasowanie ma byæ najlepsze w tym sensie, ¿e wybrana funkcja musi mieæ przynajmniej jeden argument lepiej dopasowany ni¿ ka¿da z pozosta³ych, mo¿liwych do zaakceptowania funkcji.Proces dopasowania argumentów jest to najkrótszy ci¹g przekszta³ceñ (konwersji) typu argumentu (-ów) aktualnego w typ argumentu(-ów) formalnego.W ci¹gu tym dopuszcza siê co najwy¿ej jedn¹ konwersjê jawn¹, tj.zadan¹ przez programistê.W procesie dopasowania maj¹ miejsce zestawione ni¿ej regu³y.Dopasowanie dok³adne.Typy argumentów aktualnych i formalnych s¹ te same lub przechodz¹ w siebie drog¹ konwersji trywialnych: typ T w T&, typ T& w typ T[] w T*, typ T w const T, typ T*, w const T*, typ T(argumenty) w T(*)(argumenty).Dopasowanie z promocj¹.Je¿eli nie powiedzie siê dopasowanie dok³adne, to kompilator stosuje wszelkie mo¿liwe promocje.Dla typów ca³kowitych, argumenty typu char, unsigned char, enum oraz short int, s¹ promowane do typu int.Je¿eli rozmiarsizeof(short int) <= sizeof(int),to argument typu unsigned short int jest promowany do typu int.Dla typów zmiennopozycyjnych stosowana jest specjalna promocja z float do double.Pokazane ni¿ej deklaracje funkcji przeci¹¿onych i ich wywo³ania ilustruj¹ niektóre promocje.Przyk³ad 5.24.#include <iostream [ Pobierz caÅ‚ość w formacie PDF ]