Przeciążenie (przeładowanie nazw) funkcji

Podobne dokumenty
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Język C++ Różnice między C a C++

Techniki Programowania przeładowanie funkcji

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Przekazywanie argumentów wskaźniki

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wstęp do programowania

PROGRAMOWANIE NISKOPOZIOMOWE. Struktury w C. Przykład struktury PN.06. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Podstawy Programowania Obiektowego

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Wstęp do programowania obiektowego, wykład 7

Przesłanianie nazw, przestrzenie nazw

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Szablony. Szablony funkcji

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Język C++ zajęcia nr 2

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Podział programu na moduły

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Szablony klas, zastosowanie szablonów w programach

PROGRAMOWANIE NISKOPOZIOMOWE

C++ wprowadzanie zmiennych

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Programowanie obiektowe 2005/2006. Laboratorium 1. Przeciążanie funkcji

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Pytania sprawdzające wiedzę z programowania C++

Język C++ wykład VIII

Programowanie proceduralne w języku C++ Funkcje

Podstawy programowania skrót z wykładów:

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wstęp do programowania. Wykład 1

Obsługa wyjątków. Język C++ WW12

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Rzutowanie i konwersje

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie komputerowe. Zajęcia 1

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Techniki Programowania wskaźniki 2

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Podstawy Programowania Obiektowego

Plik klasy. h deklaracje klas

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Programowanie 2. Język C++. Wykład 1.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

I - Microsoft Visual Studio C++

Część 4 życie programu

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Zadanie 2: Arytmetyka symboli

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Programowanie 2. Język C++. Wykład 3.

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie - wykład 4

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Wstęp do Programowania 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie obiektowe w C++ Wykład 1

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie 2. Język C++. Wykład 9.

Projektowanie klas c.d. Projektowanie klas przykład

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Abstrakcyjny typ danych

Programowanie Procedurale

Wyjątki (exceptions)

Programowanie obiektowe język C++

Wykład Funkcje Struktura funkcji Deklaracja i definicja funkcji Przekazywanie parametrów do funkcji

Wstęp do Programowania, laboratorium 02

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Symfonia C++ standard : programowanie w języku C++ orientowane obiektowo. T. 1 / Jerzy Grębosz. Wyd. 3 C - popr. Kraków, 2015.

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Opus Magnum C++11 : programowanie w języku C++. Tom 1 / Jerzy Grębosz. Gliwice, cop Spis treści

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Transkrypt:

Przeciążenie (przeładowanie nazw) funkcji dla większości języków (w tym C) zasada w programie może być tylko jedna funkcja o danej nazwie kompilator C++ - dopuszcza więcej niż jedną funkcję o tej samej nazwie o ile różnią się one liczbą i/lub typem argumentów Przekład: Mamy dwie funkcje: void wypisz(int); void wypisz(char, float, char); Teraz wywołanie: wypisz( A, 3.14, F ); Czy mamy wątpliwości której funkcji użyć? taką sytuację nazywamy przeciążeniem (przeładowaniem nazwy) funkcji Przykład: #include <stdio.h> void wypisz(int liczba); void wypisz(char znak, float x, char *tekst); void wypisz(int liczba, char znak); void wypisz(char znak, int liczba); main() wypisz(123); wypisz('d',7); wypisz('a',82.3,"stopnie Celsjusza"); wypisz(4,'z');

void wypisz(int liczba) printf("liczba typu int: %d\n",liczba); void wypisz(char znak, float x, char *tekst) printf("blok %c : %.1f %s\n",znak,x,tekst); void wypisz(int liczba, char znak) printf("%d razy wystapil stan %c\n",liczba,znak); void wypisz(char znak, int liczba) printf("%c. %d\n",znak,liczba); Liczba typu int: 123 D. 7 Blok A : 82.3 stopnie Celsjusza 4 razy wystapil stan Z o 4 funkcje o tej samej nazwie o można odróżnić nawet funkcję o tej samej nazwie, liczbie i typie argumentów (o ile różnią się kolejnością) o działanie: kompilator analizuje wywołanie, przegląda argumenty i dobiera funkcję, która pasuje Podsumowanie: przeciążenie (przeładowanie) funkcji nadanie funkcji wielu znaczeń poprzez istnienie kilku funkcji o identycznej nazwie wybór wersji funkcji zależy od kontekstu jej użycia (ilości, typu i kolejności argumentów

Po co i kiedy przeciążać (przeładowywać): gdy przeciążane funkcje robią to samo (np. wypisują na ekran) a my chcemy, by nazwa zdawała sprawę z tego, co funkcja robi konstruktory i destruktory klas (nazwa jest ustalona) Przeładowanie funkcji a argumenty domyślne możliwe niejednoznaczności (błędy) void fun(int a) void fun(int b, int c=0) main() fun(1); // niejednoznaczność - błąd Jak to działa naprawdę? kompilator C++ modyfikuje nazwy funkcji void wypisz(int liczba) wypisz_fi void wypisz(int liczba, char znak) wypisz_fic Tak zmodyfikowane nazwy są już unikalne: wypisz(3, A ) wypisz_fic(3, A )

Linkowanie z modułami innych języków zamiana nazwy funkcji dla wszystkich funkcji w C++ nie jest dokonywana przez kompilatory innych języków źródło problemów w sytuacjach, gdy linkujemy moduły skompilowane różnymi kompilatorami Przykład: Moduł 1 (w C) : mod1.c mod1.o Moduł 2: (w C++) : mod2.cpp mod2.o Niech mod1.c zawiera funkcję void wypisz(int, char), chcemy ją użyć w mod2.cpp Zwykła procedura deklaracja extern w mod2.cpp: extern void wypisz(int, char); nie wystarcza!!! Powód kompilator C++ zmieni nazwę funkcji; każe linkerowi szukać funkcji: void wypisz Fic(int, char); Wyjście: należy zastosować deklarację: extern C void wypisz(int, char); lub, gdy chcemy włączyć kilka funkcji: extern C int jeden(int); float dwa(double); //. Tak można włączać w program w C++ moduły z innych języków (nie tylko C) np. asemblera, Fortranu itp.

Przeładowanie zasłonięcie: przeładowanie tylko wtedy, gdy zakres ważności funkcji identyczny w przeciwnym wypadku zasłonięcie Przykład: Plik1: #include <iostream> void dzwiek(int a) cout << a << " nuty" << endl; void dzwiek(float x) cout << "Czestotliwosc : " << x << " hercow " << endl; Funkcje wykorzystane w: #include <iostream> using namespace std; extern void dzwiek(int); main() dzwiek(4); extern void dzwiek(float); dzwiek(2); dzwiek(1.37); dzwiek(3); dzwiek(2.71); 4 nuty Częstotliwość : 2 hercow Częstotliwość: 1.37 hercow 3 nuty 2 nuty

Przeładowanie przypadki szczególne przeładowanie możliwe, gdy mamy różnice w liście argumentów nie każde różnice typów dają podstawy do rozróżnień warunek konieczny jednoznaczność ilości i rodzaju argumentów aktualnych (inicjalizatorów) przykłady przypadków, które nie pozwalają na zastosowanie mechanizmu przeładowania: o typy uzyskiwanie przez typedef są w istocie identyczne; nie możemy dokonać przeładowania: typedef int calk; void ff(int); void ff(calk); o tablica vs. wskaźnik również są identyczne z punktu widzenia przeładowania double oblicz(double vector[ ] ); double oblicz(double *wsk); o zmienna vs. referencja na przykład obie poniższe funkcje void fun1(int k); void fun1(int &k); mogą być wywołane z takim samym argumentem aktualnym (inicjalizatorem) są z punktu widzenia przeładowania identyczne int m; fun1(m); o identyczność typu T, const T, volatile T funkcje: void ff(int) ; void ff(const int a) ; void ff(volatile int c); mogą być wywolane identycznie: int r=3; ff(r); (dostaję kopię, dodatkowo obiecuję, że nic nie zmienię (nie będę robił żadnych optymalizacji)

przypadki gdzie przeładowanie mozliwe o Typ wyliczeniowy przyjmuje wartości całkowite, ale w istocie to odrębne typy rozróżnialne w przeładowaniu enum kolor zielony=3, zolty =6, czerwony=9; void zapal(int); void zapal(kolor); o Typy: T*, volatile T*, const T* argumentami są kolejno : adres obiektu typu T, adres obiektu stałego typu T, adres obiektu volatile typu T, obiekty tak wskazane są różnego typu, są one dostępne w miejscu wywołania (oryginały) i nie mogą być użyte zamiennie czyli każdy z nich może wybierać właściwą wersję funkcji przeładowanie działa o podobnie typy T &, volatile T &, const T & Przeładowanie etapy dopasowania w sytuacji przeładowania niekoniecznie musimy znaleźć wersje funkcji która będzie dokładnie odpowiadać liczbie i rodzajowi aktualnych argumentów wywołania dopasowanie jest O.K. gdy kompilator znajdzie dokładnie jedną wersję funkcji, która pasuje lepiej niż inne gdy dwie lub więcej wersji pasuje równie dobrze błąd (niejednoznaczność) zasady poszukiwania właściwej wersji: o dopasowanie dokładne, dopasowanie z trywialną konwersją lista trywialnych konwersji T T& T& T T[ ] T* T(arg) (*T)(arg) T const T T volatile T T* const T* T* volatile

o dopasowanie z awansem (np. zamiana float double, zamiana bez utraty informacji) dla argumentów całkowitych do int (lub unsigned int) o dopasowanie z użyciem konwersji standardowych (równeż takich, które gubią część informacji np. double float, float int) o dopasowania z użyciem konwersji własnych programisty o dopasowanie do funkcji z wielokropkiem gdy mamy kilka argumentów wymagających dopasowania, to procedura jest wykonywana dla każdego z nich wynik dopasowania wersja, do której parametry pasują tak samo lub lepiej niż do innych Przykład: mamy przeładowane wersje funkcji: f(char*, int); f(double, float); f(double, unsigned int); oraz wywołanie: f(2, 3); Która wersja zostanie wykonana?