Programowanie obiektowe C++

Podobne dokumenty
Programowanie obiektowe C++

Programowanie obiektowe C++

Programowanie obiektowe C++

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

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

Programowanie obiektowe C++

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

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

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

Języki programowania

Podstawy Programowania Obiektowego

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

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie Obiektowe i C++

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

Przeciążenie (przeładowanie nazw) funkcji

Przeciążanie operatorów

ROZDZIAŁ 2. Operatory

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

Programowanie obiektowe C++

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

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

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

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

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

Każdy z nich posiada swoje parametry. W przypadku silnika może to być moc lub pojemność, w przypadku skrzyni biegów można mówić o skrzyni

C++ - [4-7] Polimorfizm

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

TEMAT : KLASY DZIEDZICZENIE

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

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

Podstawy Programowania Obiektowego

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

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

Wstęp do Programowania 2

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

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

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

Przeciążenie operatorów

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Język C++ wykład VIII

Wyliczanie wyrażenia obiekty tymczasowe

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

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

Wykład 5: Klasy cz. 3

Szablony funkcji i szablony klas

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

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

PARADYGMATY PROGRAMOWANIA Wykład 2

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Programowanie, część I

Programowanie obiektowe C++

Referencje do zmiennych i obiektów

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

dr inż. Jarosław Forenc

Dziedziczenie jednobazowe, poliformizm

Programowanie komputerowe. Zajęcia 5

Wykład 8: klasy cz. 4

Język ludzki kod maszynowy

Szablony klas, zastosowanie szablonów w programach

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

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

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

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

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

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

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

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

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

Programowanie obiektowe i C++ dla matematyków

Wykład 2 Składnia języka C# (cz. 1)

Wprowadzenie do szablonów szablony funkcji

Programowanie Obiektowew języku C++ Zadania L4

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

Programowanie obiektowe język C++

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Wprowadzenie do szablonów szablony funkcji

Wykład :37 PP2_W9

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

Programowanie obiektowe w C++ Wykład 12

Język C++ zajęcia nr 2

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Każdy z nich posiada swoje parametry. W przypadku silnika może to być moc lub pojemność, w przypadku skrzyni biegów można mówić o skrzyni

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie komputerowe. Zajęcia 7

Materiały do zajęć VII

Do czego służą klasy?

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Laboratorium 1 - Programowanie proceduralne i obiektowe

Wstęp do Programowania 2

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

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

Zaawansowane programowanie w C++ (PCP)

Lab 9 Podstawy Programowania

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

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Transkrypt:

Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 3 Witold Dyrka witold.dyrka@pwr.wroc.pl 22/10/2012

Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o: slajdy Bjarne Stroustrupa do kursu Foundations of Engineering II (C++) prowadzonego w Texas A&M University http://www.stroustrup.com/programming C++ Operator Overloading Guidelines, Donnie Pinkston, Caltech http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html przykładowe programy Jerzego Grębosza do książki Symfonia C++ Standard http://www.ifj.edu.pl/~grebosz/symfonia_c++_std_p.html Dziękuję dr inż. lek. med. Marcinowi Masalskiemu za udostępnienie materiałów do wykładu w roku ak. 2010/11

Program wykładów 1. Wprowadzenie. Obsługa błędów. Klasy (8/10) 2. Abstrakcja i enkapsulacja: klasy i struktury. (15/10) 3. Polimorfizm: przeładowanie funkcji i operatorów. Konwersje (22/10) 4. Zarządzanie pamięcią: konstruktory, destruktory, pryzpisanie (29/10) 5. Dziedziczenie. Polimorfizm dynamiczny (5/11) 6. Programowanie uogólnione: szablony (12/11)

Materiały Literatura Bjarne Stroustrup. Programowanie: Teoria i praktyka z wykorzystaniem C++. Helion (2010) Jerzy Grębosz. Symfonia C++ standard. Edition 2000 (2008) C++ Operator Overloading Guidelines, Donnie Pinkston, Caltech http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html Dowolny podręcznik programowania zorientowanego obiektowo w języku C++ w standardzie ISO 98 Środowisko programistyczne Microsoft Visual C++ (rekomendowane) Dowolne środowisko korzystające z GCC

Słowniczek Abstrakcja technika tworzenie programu tak, aby można było z niego korzystać bez wnikania w szczegóły implementacji Enkapsulacja (hermetyzacja) ukrywanie składowych klasy zawierających szczegóły implementacji Interfejs część klasy umożliwiająca korzystanie z obiektu (co można zrobić z obiektem) Implementacja część klasy definiująca szczegółowe sposoby przechowywania danych i działania (jak to jest robione) Niezmienniki reguły opisujące poprawne stany klasy

Słowniczek Funkcje składowe funkcje zdefiniowane w klasie, mają dostęp do wszystkich składników obiektu Stałe funkcje składowe funkcje składowe, które nie mogą modyfikować obiektu Funkcje pomocnicze funkcje zdefiniowane poza klasą, które operują na obiektach klasy Funkcje zaprzyjaźnione funkcje pomocnicze z prawem dostępu do prywatnych składników klasy Składniki statyczne wspólne dla wszystkich obiektów klasy, nie związane z konkretnym obiektem

Plan na dziś Polimorfizm (statyczny) przeładowanie nazwy funkcji przeładowanie operatorów Konwersje

Przeładowanie nazwy funkcji void wypisz(int); void wypisz(char, double, const string); void wypisz(int, char); void wypisz(char, int); int main() { wypisz(12345); wypisz(8, 'X'); wypisz('d', 89.5, " stopni Celsjusza "); wypisz('m', 22); void wypisz(int liczba) { cout << "Liczba typu int: " << liczba << endl; void wypisz(char numer_bloku, double wartosc, const string opis ) { cout << "Blok " << numer_bloku << ": " << wartosc << opis << endl; void wypisz(int liczba, char znak) { cout << znak << ") " << liczba << endl; void wypisz(char stan, int liczba) { cout << liczba << " razy wystapil stan " << stan << endl;

Przeładowanie nazwy funkcji void wypisz(int); void wypisz(char, double, const string); void wypisz(int, char); void wypisz(char, int); int main() { wypisz(12345); wypisz(8, 'X'); wypisz('d', 89.5, " stopni Celsjusza "); wypisz('m', 22); Liczba typu int: 12345 X) 8 Blok D: 89.5 stopni Celsiusza 22 razy wystapil stan M Aby kontynuować, naciśnij dowolny klawisz... void wypisz(int liczba) { cout << "Liczba typu int: " << liczba << endl; void wypisz(char numer_bloku, double wartosc, const string opis ) { cout << "Blok " << numer_bloku << ": " << wartosc << opis << endl; void wypisz(int liczba, char znak) { cout << znak << ") " << liczba << endl; void wypisz(char stan, int liczba) { cout << liczba << " razy wystapil stan " << stan << endl;

Polimorfizm statyczny Dla kompilatora i linkera nazwa funkcji składa się z nazwy funkcji i typu argumentów, np. w MS VC++ 2005: void wypisz(int) (?wypisz@@yaxh@z) void wypisz(char, double, const string) (?wypisz@@yaxdnv? $basic_string@du?$char_traits@d@std@@v $allocator@d@2@@std@@@z) void wypisz(int, char) (?wypisz@@yaxhd@z) void wypisz(char, int) (?wypisz@@yaxdh@z) int wypisz(double) (?wypisz@@yahn@z) Decyzja, którą wersję funkcji wybrać jest podejmowana na etapie kompilacji przeładowujemy nazwę funkcji nie samą funkcję Dociekliwi: zajrzyjcie do pliku.obj

Reguły Różne wersje funkcji muszą różnić się typami argumentów int funkcja1(int argument1); int funkcja1(int parametr1); int funkcja3(int argument1); int funkcja3(double argument2); int funkcja2(int); double funkcja2(int); int funkcja4(int, char); int funkcja4(char, int); int funkcja5(double); int funkcja5(const double); int funkcja6(double &); int funkcja6(const double&); Kompilator musi móc rozróżnić o którą wersję chodzi: void funkcja7(int parametr1); void funkcja8(int parametr1, int p2 = 0); void funkcja7(int &parametr1); void funkcja8(int parametr1);

Reguły Różne wersje funkcji muszą różnić się typami argumentów int funkcja1(int argument1); int funkcja1(int parametr1); int funkcja3(int argument1); int funkcja3(double argument2); int funkcja2(int); double funkcja2(int); int funkcja4(int, char); int funkcja4(char, int); Poprawny kod, ale łatwo o pomyłkę NIE POLECAM int funkcja5(double); int funkcja5(const double); int funkcja6(double &); int funkcja6(const double&); Kompilator musi móc rozróżnić o którą wersję chodzi: void funkcja7(int parametr1); void funkcja8(int parametr1, int p2 = 0); void funkcja7(int &parametr1); void funkcja8(int parametr1); int a,&b=a; funkcja8(10); // Błąd! funkcja7(a); // Błąd! funkcja8(10,1); // ale to ok funkcja7(b); // Błąd! Dokładne zasady dopasowywania? Poszukaj sam(a)!

Plan na dziś Polimorfizm (statyczny) przeładowanie nazwy funkcji przeładowanie operatorów Konwersje

Przeładowanie operatorów Można zdefiniować (czyli przeładować) prawie wszystkie operatory dla operandów typu użytkownika (klasa, wyliczenie), np. enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec ; Month operator++(month& m) { m = (m==dec)? jan : Month(m+1); return m; // operator inkrementacji prefiksowej // zawijanie Month m = nov; ++m; // m zmienia się na dec ++m; // m zmienia się na jan

Zasady przeładowania operatorów Można definiować działania tylko istniejących operatorów np. + - * / % [] () ^! & < <= > >= Trzeba zachować konwencjonalną liczbę operandów np., nie ma unarnego (jednoargumentowego) <= (mniejsze-równe) albo binarnego (dwuargumentowego)! (negacja) Każdy przeładowany operator musi mieć przynajmniej jeden operand typu użytkownika int operator+(int,int); // błąd: nie można przeładować wbudowanego+ Wielomian operator+(const Wielomian&, const Wielomian &); // ok Wielomian operator+(const Wielomian&, int); // ok Dobre rady: nadawaj operatorom tylko konwencjonalne znaczenie + powinnien być dodawaniem, * - mnożeniem, [] - dostępem, a () wywołaniem przeładowuj tylko jeśli to naprawdę potrzebne

Złożone operatory przypisania +=, -=, *=,... Załóżmy że potrzebujesz operatorów + i - Naturalne jest oczekiwanie, że udostępnisz też += i -= Zacznij definiowanie operatorów właśnie od nich Modyfikują obiekt na którym działają Zdefiniuj je jako nie-statyczne składowe klasy Punkt & Punkt::operator+=(const Punkt &prawa_strona) { this->x += prawa_strona.x; // this jest wskaźnikiem na obiekt y += prawa_strona.y; // na rzecz którego wywoływana this->z += prawa_strona.z; // jest funkcja lub operator return *this; // zamiana obiektu *this na referencję następuje automatycznie

Złożone operatory przypisania +=, -=, *=,... Punkt & Punkt::operator+=(const Punkt &prawa_strona) { this->x += prawa_strona.x; this->y += prawa_strona.y; this->z += prawa_strona.z; return *this; Przekazujemy zmienną prawa_strona przez referencję ze względu na efektywność stała referencja obiecujemy, że nie zmieniamy prawej strony przypisania Zwracamy referencję do lewej strony przypisania umożliwia sekwencję przypisań, jak dla typów wbudowanych, np. int a, b, c; (a += b) += c; Punkt A(0,1,2), B(3,4,5), C(6,7,8); (A += B) += C;

Dwuargumentowe operatory arytmetyczne +, -, *,... Nie modyfikują obiektów, które są ich operandami Zdefiniuj je jako funkcje pomocnicze poza klasą const Punkt operator+(const Punkt &lewa_strona, const Punkt &prawa_strona) { Punkt wynik = lewa_strona; // tworzy zmienną wynik i inicjuje ją // zmienną lewa_strona // (używa konstruktora kopiującego) wynik += prawa_strona; // wykorzystuje operator złożonego przypisania return wynik; To samo, tylko zwieźle: const Punkt operator+(const Punkt &lewa_strona, const Punkt &prawa_strona) { return Punkt(lewa_strona) += prawa_strona; Zwracamy stałą wartość by udaremnić nonsensowny kod typu: (a + b) = c; // bez sensu

Pre- i postinkrementacja ++C i C++ class Proba { int numer_kolejny; vector<bool> wynik; ; Proba pr(0); Preinkrementacja: cout << ++pr; // równoważne pr.operator++(); Proba &Proba::operator++() { this->numer_kolejny++; this->wynik.push_back(false); //... return *this; // operator inkrementacji prefiksowej // modyfikuje obiekt, więc w klasie Postinkrementacja: cout << pr++; // równoważne pr.operator++(0); Proba Proba::operator++(int pomijany) { // operator inkrementacji postfiksowej Proba kopia = *this; // wykonaj kopię bieżącego stanu obiektu this ++(*this); // wykorzystaj operator preinkrementacji return kopia;

Operatory porównania ==,!= bool operator==(const Punkt &lewa_strona, const Punkt &prawa_strona) { return lewa_strona.wezx() == prawa_strona.wezx() && lewa_strona.wezy() == prawa_strona.wezy && lewa_strona.wezz() == prawa_strona.wezz; // Zauważ: operator== wcale nie musi być zaprzyjaźniony z klasą Punkt bool operator!=(const Punkt &lewa_strona, const Punkt &prawa_strona) { return!(lewa_strona==prawa_strona); // wykorzystaj operator równości

Operatory wczytania >> i wypisania << MojaKlasa mk; cin >> mk; cout << mk; Modyfikują strumienie wejścia (cin) / wyjścia (cout) operator>> modyfikuje obiekt mk typu MojaKlasa Wymagana składnia: ostream& operator<<(ostream &, const MojaKlasa &); istream& operator>>(istream &, MojaKlasa &); // wypisywanie // wczytywanie Operator NIE może być funkcją składową MojaKlasa::operator>>(...) (pierwszy argument NIE jest typu MojaKlasa)

Przykład: Operatory wczytania >> i wypisania << dla klasy Date ostream& operator<<(ostream os&, const Date &d) { // wypisywanie daty return os << '(' << d.year() // obiekt os klasy ostream może być << '/' << d.month() // ekranem, plikiem lub łańcuchem zn. << '/' << d.day() << ')'; istream& operator>>(istream &is, Date &d) { // wczytywanie daty // w formacie (rok/miesiać/dzień) int y,m,d; // rok, miesiąc, dzień char ch1,ch2,ch3,ch4; // znaki formatujące is >> ch1 >> y >> ch2 >> m3 >> ch3 >> d >> ch4; if (!is) return is; // jeśli wystąpił błąd wejścia (bool operator!() const) if (ch!='(' ch2!='/' ch3!='/' ch4!=')') // błąd formatu daty is.clear(ios_base::failbit) ; // ustawia bit błędu oznaczający zły format // Dla dociekliwych: możnaby is skonfigurować tak aby wyrzucała tutaj wyjątek return is;

Operator dostępu [] Musi być składową funkcji pobiera jeden parametr indeks powinien być przeładowany dwukrotnie w wersji zmieniającej i niezmieniającej obiektu double &Wielomian::operator[](int który) { return wektor_wspolczynnikow.at(ktory); // at() - funkcja z kontrolą zakresu class Agent { vector<string> nazwisko, kryptonim; ; string &Agent::operator[](string szukany_kryptonim) { for (int i=0; i<kryptonim.size(); i++) if (kryptonim[i]==szukany_kryptonim) return(nazwisko[i]); throw runtime_error(''brak danych''); Agent listaagentow; cout << listaagentow[''007'']; // można indeksować // innymi typami niż int

Operator wywołania () Kiedy klasa ma jedną główną funkcję, np. void Klakson::operator()(int ile_razy) { for (int i=0;i<ile_razy;i++) cout << ''Ti-tit!\t''; lub gdy tworzymy obiekt funkcyjny, np. struct Punkt { double x; double y; double z; //... ; std::vector<punkt> punkty; //Tworzymy obiekty funkcyjne struct PorownajPunktyX { bool operator()(const Punkt &a, const Punkt& b) const { return a.x < b.x; ; struct PorownajPunktyY { bool operator()(const Punkt &a, const Punkt& b) const { return a.y < b.y; ; std::sort(punkty.begin(), punkty.end(), PorownajPunktyX()); std::sort(punkty.begin(), punkty.end(), PorownajPunktyY()); // sortuj wg współrzędnej X // sortuj wg współrzędnej Y

Plan na dziś Polimorfizm (statyczny) Konwersje

struct zespol { double rzeczyw; double urojon; Konwersje ; zespol(double r, double i):rzeczyw(r),urojon(i) { // konstruktor int main() { double x = 3.21; zespol z(6, -2);

struct zespol { double rzeczyw; double urojon; Konstruktor konwertujący ; zespol(double r, double i):rzeczyw(r),urojon(i) { // konstruktor zespol(double r):rzeczyw(r),urojon(0) { // konstruktor konwerujący double -> zespol int main() { double x = 3.21; zespol z(6, -2); zespol zz(x);

struct zespol { double rzeczyw; double urojon; Konwersja ; zespol(double r, double i):rzeczyw(r),urojon(i) { // konstruktor zespol(double r):rzeczyw(r),urojon(0) { // konstruktor konwerujący double -> zespol const zespol dodaj(const zespol& a, const zespol& b); int main() { double x = 3.21; zespol z(6, -2); zespol zz(x); zespol wynik = dodaj(z, zz); // niepotrzebna żadna konwersja // poniższe wywołanie nie jest dopasowane, ale mimo to możliwe, bo // kompilator samoczynnie zastosuje naszą konwersję wynik = dodaj(z, 4); // konstr. konwertujący double --> zespol dodaj(z,zespol(4))

struct zespol { double rzeczyw; double urojon; Zwięzły konstruktor ; zespol(double r, double i = 0):rzeczyw(r),urojon(i) { // konstruktor (konwertujący) const zespol dodaj(const zespol& a, const zespol& b); int main() { double x = 3.21; zespol z(6, -2); zespol zz(x); zespol wynik = dodaj(z, zz); // niepotrzebna żadna konwersja // poniższe wywołanie nie jest dopasowane, ale mimo to możliwe, bo // kompilator samoczynnie zastosuje naszą konwersję wynik = dodaj(z, 4); // konstr. konwertujący double --> zespol dodaj(z,zespol(4))

struct zespol { double rzeczyw; double urojon; Funkcja konwertująca ; zespol(double r, double i = 0):rzeczyw(r),urojon(i) { operator double() { return rzeczyw; // konstruktor (konwertujący) // operator konwersji double pole_kwadratu(double bok) { return bok*bok; int main() { double x = 3.21; zespol z(6, -2); double pole = pole_kwadratu(x); // niepotrzebna żadna konwersja // poniższe wywołanie nie jest dopasowane, ale mimo to możliwe, bo // kompilator samoczynnie zastosuje naszą konwersję pole = pole_kwadratu(z); // operator konwersji zespol -> double // pole_kwadratu(double(z))

struct zespol { double rzeczyw; double urojon; Uwaga! ; zespol(double r, double i = 0):rzeczyw(r),urojon(i) { operator double() { return rzeczyw; // konstruktor (konwertujacy) // operator konwersji const zespol dodaj(const zespol& a, const zespol& b); const zespol operator+(const zespol& a, const zespol& b); double pole_kwadratu(double bok) { return bok*bok; int main() { double x = 3.21; zespol z(6, -2); wynik = dodaj(z,x); wynik = z+x; // ok, dodaj(z,zespol(x)) // Błąd! z+zespol(x) czy double(z)+x Rzeczywiście, biblioteczny typ complex nie ma operatora konwersji zamiast tego są funkcje real i imag

Dziś najważniejsze było to, że... Przeładowanie funkcji różne zachowania dla różnych typów argumentów Przeładowanie operatorów Można definiować działania tylko istniejących operatorów Trzeba zachować konwencjonalną liczbę operandów Każdy przeładowany operator musi mieć przynajmniej jeden operand typu użytkownika Nadawaj operatorom tylko konwencjonalne znaczenie Przeładowuj tylko jeśli to naprawdę potrzebne

A za tydzień... Zarządzanie pamięcią: konstruktor, destruktor, przypisanie...