Wartości domyślne, przeciażenia funkcji Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępiony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.
Domyślne wartości parametrów funkcji void Funkcja A( int ip, float fp = 2.4, char const sp = Łańcuch znaków ) int main( ) Funkcja A(2); // Funkcja A(2,2.4, Łańcuch znaków ); Funkcja A(2, 9); // Funkcja A(2,9.0, Łańcuch znaków ); Funkcja A(2, Nowy łańcuch ); Funkcja A(2, 2.4, Inny łańcuch ); // Funkcja A(2,2.4, Inny łańcuch ); Definiowanie wartości domyślnych pozwala pominać wybrany parametr przy wywołaniu. Jednak zaniechanie odwołania się do tego parametru musi dotyczyć również wszystkich pozostałych występujacych po nim. Wartości domyślne, przeciażenia funkcji 1
Domyślne wartości parametrów funkcji Czy definiowanie wartości domyślnych jest możliwe w dowolnym porzadku? np. void Funkcja B( double dp = 4, int ip, char const sp = Łańcuch znaków ) Jeżeli dla danego parametru zostanie zdefiniowana wartość domyślna, to dla wszystkich parametrów występujacych po nim również musza zostać zdefiniowane wartości domyślne. Wartości domyślne, przeciażenia funkcji 2
Domyślne wartości parametrów funkcji Występowanie wartości domyślnych w zapowiedzi definicji funkcji. void Funkcja A( int ip, float fp = 2.4, char const sp = Łańcuch znaków ); void Funkcja A( int ip, float fp = 2.4, char const sp = Łańcuch znaków ) Jeżeli występuje zapowiedź funkcji, to w przypadku zdefiniowania domyślnych wartości parametrów musza one zostać umieszczone w zapowiedzi definicji. Niedopuszczalne jest wówczas powtórne redefiniowanie tych wartości w samej definicji funkcji (choćby były to te same wartości). Wartości domyślne, przeciażenia funkcji 3
Przeciażanie void Funkcja A( int ip ) void Funkcja A( int ip, float fp ) void Funkcja A( int ip, float fp, char const sp ) int main( ) Funkcja A(2); Funkcja A(2, 9.0); Funkcja A(2, 2.4, Inny łańcuch ); Przeciażenia sa możliwe dzięki temu, że funkcje sa identyfikowane poprzez swoje nazwy i listę typów parametrów. Wartości domyślne, przeciażenia funkcji 4
Przeciażanie void Funkcja A( int ip1, int ip2 ) void Funkcja A( int ip, float fp ) int main( ) Funkcja A(2, 9); Funkcja A(2, 9.0); Funkcja A(2, (float)9.0); //Jaka zostanie tutaj wywołana funkcja? //A jaka w tym miejscu? // To wywołanie jest poprawnym wywołaniem // drugiej z funkcji. Przeciażenia moga prowadzić do niejednoznaczności w przypadku, gdy dla danego typu aktualnego parametru wywołania funkcji istnieja domyślne konwersje dla obu typów argumentów, które sa podstawa rozróżnienia przeciażenia danej funkcji, np. dla wywołań powyżej dla typu double sa możliwe dwie konwersje, tzn. do typu intoraz do typu float (wartość 9.0 domyślnie traktowana jest jako wartość typu double). Wartości domyślne, przeciażenia funkcji 5
void Funkcja A( int ip ) Przeciażanie void Funkcja A( int ip, float fp ) void Funkcja A( int ip, float fp = 2.4, char const sp = Pewien napis ) int main( ) Funkcja A(2); Funkcja A(2, 9); Funkcja A(2, 9, Nowy napis ); Czy wszystko tu jest dobrze? Wartości domyślne, przeciażenia funkcji 6
void Funkcja A( int ip ) Przeciażanie void Funkcja A( int ip, float fp ) void Funkcja A( int ip, float fp = 2.4, char const sp = Pewien napis ) int main( ) Funkcja A(2); Funkcja A(2, 9); Funkcja A(2, 9, Nowy napis ); Wprowadzone w sposób nie przemyślany wartości domyślne parametrów moga prowadzić do niejednoznaczności tworzonych przeciażeń. Błędy te nie sa groźne, gdyż wykrywane sa na etapie kompilacji lub konsolidacji. Wartości domyślne, przeciażenia funkcji 7
Przeciażanie Inny typ przeciażenia, ale czy tak można? void Funkcja A( int ip ) int Funkcja A( int ip ) TAK NIE MOŻNA. Przeciażenia moga być dokonywane ze względu na listę parametrów funkcji. Typ zwracanej wartości nie może być podstawa do realizacji przeciażenia. Tego rodzaju błędy wykrywane sa na etapie kompilacji lub konsolidacji. Wartości domyślne, przeciażenia funkcji 8
Pytania i ćwiczenia 1. Dane sa definicje funkcji: void Funkcja(int ip, char napis ) ip = 5; int Funkcja(int ip, char const napis ) return 0; Czy przedstawione powyżej przeciażenie jest poprawne? Jeśli tak, to która funkcja zostanie uruchomiona dla wywołania: Funkcja(9, napis )? Jeżeli nie, to jak należy zapisać to przeciażenie aby było poprawne? 2. Dane sa definicje funkcji: int funkcja( int i, char const s = ) return 2; int funkcja( double i, char const s = napis ) return 3; double funkcja( ) return 3; Czy wywołanie funkcja(funkcja(funkcja(funkcja()))) jest poprawne? Jeżeli tak, to napisz które po kolei funkcje sa wywoływane. Jeżeli nie, to jak należy zmienić powyższe definicje aby wywołanie takie było poprawne? Wartości domyślne, przeciażenia funkcji 9