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

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

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

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

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

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

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

Przeciążenie operatorów

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wykład 4: Klasy i Metody

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

TEMAT : KLASY DZIEDZICZENIE

Szablony klas, zastosowanie szablonów w programach

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

Laboratorium nr 10. Temat: Funkcje cz.2.

PARADYGMATY PROGRAMOWANIA Wykład 4

Szablony. Szablony funkcji

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Przeciążanie funkcji. Przykład 1: #include <iostream> using namespace std; double srednia(double n1, double n2) { return ((n1 + n2)/2.

PARADYGMATY PROGRAMOWANIA Wykład 3

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

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

Wykład 5: Klasy cz. 3

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

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

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

Programowanie obiektowe w C++ Wykład 12

Techniki Programowania wskaźniki 2

Język C++ zajęcia nr 2

Konstruktor kopiujacy

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie w języku C++

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

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

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

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

Wyliczanie wyrażenia obiekty tymczasowe

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wstęp do programowania obiektowego, wykład 7

Przeciążenie (przeładowanie nazw) funkcji

Identyfikacje typu na etapie. wykonania (RTTI)

Szablony funkcji i szablony klas

Tablice, funkcje - wprowadzenie

C++ Przeładowanie operatorów i wzorce w klasach

Programowanie proceduralne w języku C++ Funkcje

Część 4 życie programu

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Rozdział 4 KLASY, OBIEKTY, METODY

Funkcja, argumenty funkcji

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

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

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

Programowanie obiektowe w języku

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

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

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Podstawy Programowania Obiektowego

Abstrakcyjny typ danych

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

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

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

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

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wstęp do programowania

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Wykład 8: klasy cz. 4

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Plik klasy. h deklaracje klas

Programowanie i struktury danych

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

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

Wartości domyślne, przeciażenia funkcji

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Funkcja (podprogram) void

Programowanie Obiektowe i C++

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

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Referencje do zmiennych i obiektów

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

Transkrypt:

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne Przeciążenie funkcji polega na użyciu funkcji z tą samą nazwą, które mają różne listy argumentów(różne typy, różna ilość lub to i inne). Przykład: void myfun(int i); void myfun(int&i); //kompilator nie widzi różnicy pomiędzy dwoma funkcjami //myfun(int i) i myfun(int&i) void fun(double*ptr); //Też nie widzi różnicy void fun(double arr[]); intmain() ii=10; myfun(ii); //błąd: którą funkcje wywołać? double tabl[20]; fun(tabl); //błąd: którą funkcje wywołać? W6 język C++ 1

Przeciążenie konstruktorów Trzy główne powody przeciążenia konstruktorów: o elastyczność kodu o korzystanie z obiektów inicjowanych oraz nieinicjowanych (wsparcie tablic) o konstruktory kopiujące Każdemu sposobowi deklaracji obiektu klasy powinna odpowiadać swoja wersja konstruktora klasy class myclass int i; public: myclass(int ii) i = ii; myclass() i = 0;.. ; int main() myclass ob(5); //wywołanie konstruktora sparametryzowanego myclass tab_ob[5]; //wywołanie konstruktora s pustą listą argumentów W6 język C++ 2

Przykład: class mydate int day, month, year; char str[512]; public: mydate(int dd, int mm, int yy) day = dd; month = mm; year = yy; mydate(char *str) sscanf(str, "%d%d%d", &day, &month, &year); void show() cout << day << " << month << " " << year << endl; ; intmain() Wydruk: mydate obb(1, 1, 2007); mydate bbo("01 01 2007"); obb.show(); bbo.show(); 1 01 2007 1 01 2007 W6 język C++ 3

class myclass int i; public: //myclass() i = 0; myclass(int ii) i = ii; ; int main() myclass ob(5); myclass *ptr_ob = NULL; try ptr_ob = new myclass [100]; //nie może być inicjowane //potrzebuje konstruktor bez parametrów catch(bad_alloc aa) //opracowanie błędu.. delete [] ptr_ob; W6 język C++ 4

Konstruktor kopiujący (kopii) Stosujemy, kiedy jeden obiekt jest użyty do inicjowania innego: o myclass A = B o przekazywanie obiektu funkcji (fun(a)) o zwracanie obiektu funkcją (myclass A = func()) Domyślnie, jeśli nie zdefiniować konstruktora kopiującego, w takich przypadkach powstaje kopia bitowa. Może to powodować efekty uboczne. Konstruktor kopiujący jest wykorzystywany automatycznie (tylko i wyłącznie pod czas inicjowania) przez kompilator, gdy obiekt służy do inicjacji innego obiektu. Wtedy domyślne tworzenie kopii bitowej jest pominięte. nazwa_klasy (const nazwa_klasy &ob) //ciało konstruktora ob jest referencją do obiektu, znajdującego po prawej stronie instrukcji inicjacji. Konstruktor kopiujący może mieć dodatkowe parametry pod warunkiem, że zdefiniowane zostaną dla nich argumenty domyślne. Przy tym pierwszym parametrem musi być referencja do obiektu. W6 język C++ 5

Uwaga! W przypadku myclass A(10); myclass B(20); A = B; konstruktor kopiujący się nie wywołuje. Tu niema inicjowania, przecież jest przypisanie, dla poprawnego działania którego trzeba przeciążyć operator przypisania. myclass C = A; //to jest inicjowanie myclass fun(); myclass A = fun(); myclass B; B = fun(); //To jest inicjowanie //To jest przypisanie Przykład W6: Wywołanie konstruktora kopiującego przy przekazywaniu obiektu funkcji Przykład W7: Wywołanie konstruktora kopiującego przy zwracaniu funkcją obiektu klasy. Inicjowanie i przypisanie. W6 język C++ 6

Domyślne argumenty funkcji W C++ dopuszcza się przypisywanie parametrom funkcji pewnych wartości domyślnych. Jeśli przy wywołani funkcji taki argument nie jest zadany, jego wartość będzie pobrana jako wartość domyślna. To jest postać ukryta przeciążenia funkcji. Przykład: void fun(int i =0; int j=0); int main(). fun(); //OK, przekazali wartości i=0; j=0 fun(5); //OK, przekazali wartości i=5, j=0 fun(24, 32); //OK, przekazali wartości i=24, j=32 return 0; void fun(int i, int j) W6 język C++ 7

Dla podanego przykładu jest niemożliwe pierwszy parametr przekazać domyślnie, a drugi nie. Argumenty domyślne muszą być zadane albo w prototypie funkcji, albo w definicji, jeśli pierwsze wywołanie tej funkcji idzie po definicji. Nie wolno zadawać jednocześnie argumenty domyślne i w prototypie, i w definicji. Wszyscy parametry domyślne muszą być umieszczone sprawa od parametrów, przekazywanych w sposób zwykły: void fun(int i, int j=0); //OK. void fun(int i=0, int j); //błąd: parametr domyślny jest zlewa od //parametru zwykłego Argumenty domyślne myszą być stałymi lub parametrami globalnymi. Argumenty domyślne a funkcje przeciążone. Przykład: Pole kwadrata: S=a*a; Pole prostokąta: S = a*b. Zamiast tego, żeby pisać funkcje przeciążone typu double policz_pole(double a, double b); double policz_pole(double a); //liczy pole prostokąta //liczy pole kwadratu W6 język C++ 8

można napisać tylko jedną funkcje double policz_pole(double a, double b = 0) if(b!= 0.0) return a*b; //pole prostokąta else return a*a; //pole kwadratu int main() double aa= 10.0; cout << pole kwadratu : << policz_pole(aa) << endl; cout << pole prostokąta: << policz_pole(aa, 20.0) << endl; Przekazanie argumentów domyślnych konstruktorom klas: class myclass int i; public: myclass(int ii = 0); ; W6 język C++ 9

int main() //jeden konstruktor z argumentem domyślnym służy dla tworzenia obiektów //inicjowanych, a również, nieinicjowanych: myclass ob(10); //ob::i = 10 myclass *ptr_ob; try ptr_ob = new myclass [20]; //tu jest potrzeby konstruktor //niesparametryzowany catch(bad_alloc aa). delete [] ptr_ob; return 0; Konstruktor kopiujący z argumentami domyślnymi: można tworzyć konstruktor kopii z argumentami dodatkowymi pod warunkiem, że wszystkie argumenty dodatkowe są argumentami domyślnymi W6 język C++ 10

class myclass int i; public: myclass(int ii = 0) i = ii; myclass(const myclass &aa, double b = 0, char str[] = "ku-ku"); int get_i() return i; void set_i(int ii) i = ii; ; myclass::myclass(const myclass &aa, double b, char *str) i = aa.get_i(); cout << "Konstr kopii i = " << i << " b = " << b << " str = " << str << endl; int main() myclass tt(10); myclass tt1 = tt; //będzie wywołany konstruktor kopii. W6 język C++ 11

Trzeba pamiętać, że przesada w użyciu argumentów domyślnych przeszkadza czytelności programu. Można używać argumenty domyślne w takich przypadkach: mamy duży program, w którym wielokrotnie jest używana funkcje void draw_rect(double x1, double y1, double x2, double y2); Po upłynięciu kilku lat okazało się niezbędnym dołączenie do listy argumentów formalnych flagi int my_flag. Dla tego, żeby nie wprowadzać zmiany w starej części kodu, która nie używa tej flagi (a może źródła tej części kodu i nie są dostępne dla nas) modyfikujemy tak: void draw_rect(double x1, double y1, double x2, double y2, int my_flag = 0); Funkcje draw_rect przepisujemy tak, żeby przy my_flag = 0 jej działanie było takie same, jak w wersji poprzedniej. Wtedy stara część kodu nie potrzebuje żadnej zmiany, a nowy kod można pisać z wykorzystaniem nowych możliwości funkcji draw_rect. W6 język C++ 12

Jeszcze jeden przykład przeciążenia funkcji: int AfxMessageBox( LPCTSTR lpsztext, UINT ntype = MB_OK, UINT nidhelp = 0 ); int AFXAPI AfxMessageBox( UINT nidprompt, UINT ntype = MB_OK, UINT nidhelp = (UINT ) -1 ); o Dla Windows NT based UINT unsigned int; DWORD - unsigned long o LPCTSTR lpsztext wiersz tekstowy, wyświetlany na dialogu o nidprompt ID resursu (string table) ten samy wiersz tekstowy może być umieszczony w resursach (tabele wierszy tekstowych) o ntype typ przycisków (OK; Yes, No; Yes, No, Cancel; Abort, Retry, Ignore;..) o nidhelp kontekst pomocy (jeśli istnieje) o Przykład: resource W6 język C++ 13

Funkcje przeciążone i niejednoznaczność - sytuacje, kiedy kompilator nie w stanie wybrać, którą z dwóch (lub więcej) funkcji przeciążonych ma wybrać. Skończy to błędem kompilacji. Najczęściej to powstaje przy automatycznej konwersji typów: float fun(float a) return a/20.0; double fun(double a) return a/20.0; int main() float x = 40.0; double y = 40.0; cout << fun(x) << endl; cout << fun(y) << endl; cout << fun(40) << endl; //OK wersje float //OK wersje double // do którego typu konwertować liczbę całą? - błąd W6 język C++ 14

Argumenty domyślne mogą powodować niejednoznaczność: int fun(int ii) cout << ii << endl; return ii; int fun(int ii, int jj = 0) cout << ii << jj << endl; return ii; int main() int iii = 40, jjj = 60; cout << fun(iii, jjj) << endl; //OK, wersje drugą cout << fun(iii) << endl; //błąd którą wersje? W6 język C++ 15

Pobieranie adresy funkcji przeciążonych. W języku C funkcja o podanej nazwie jest unikalna (brak przeciążenia) Przykłady CallFromPtr, OWW \ MultThread W języku C++ sposób deklarowania wskaźnika do funkcji decyduje o to, która z przeciążonych funkcji będzie wywołana: double funtt(double aa, double bb); int funtt(int ii, int kk); double (*ptr_fun_d)(double aa, double bb); int (*ptr_fun_i)(int ii, int kk); int main() ptr_fun_d = &funtt; ptr_fun_i = &funtt; cout << " double " << (*ptr_fun_d)(10.0, 10.5) << endl; cout << " int " << (*ptr_fun_i)(15, 16) << endl;. W6 język C++ 16

double funtt(double aa, double bb) return bb-aa; int funtt(int ii, int jj) return jj-ii; W6 język C++ 17