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

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).

Dziedziczenie. Ogólna postać dziedziczenia klas:

Przeciążenie operatorów

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

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

TEMAT : KLASY POLIMORFIZM

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

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

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

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

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

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

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

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

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

dr inż. Jarosław Forenc

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.

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

Wstęp do Programowania 2

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.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

TEMAT : KLASY DZIEDZICZENIE

Podstawy Programowania Obiektowego

PARADYGMATY PROGRAMOWANIA Wykład 3

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

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

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

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

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

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wykład 8: klasy cz. 4

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

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe w języku

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

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

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

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

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Programowanie w języku C++

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

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

Wykład :37 PP2_W9

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

Wstęp do programowania

Mechanizm dziedziczenia

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

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

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

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

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Wykład 4: Klasy i Metody

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

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

Projektowanie klas c.d. Projektowanie klas przykład

Plik klasy. h deklaracje klas

Programowanie Obiektowe i C++

Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

Część 4 życie programu

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

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

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

Programowanie Obiektowe i C++

string Rodzaj[4]= {"TV ", "wieza ", "DVD ", "kino "}; string Producent[4]={"Phillips", "Sony ", "Sanyo ", "Samsung "};

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

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

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

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

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Informacja o programowaniu w c++ Dr Maciej Bobrowski

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

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

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

Dziedziczenie jednobazowe, poliformizm

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

Programowanie obiektowe w C++ Wykład 12

Do czego służą klasy?

Język C++ Programowanie obiektowe

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

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

Szablony klas, zastosowanie szablonów w programach

Zaawansowane programowanie w języku C++ Klasy w C++

Przekazywanie argumentów wskaźniki

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

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

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

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

Programowanie obiektowe i C++ dla matematyków

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Zaawansowane programowanie w języku C++ Programowanie obiektowe

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

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

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Programowanie obiektowe

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Transkrypt:

Zwracanie obiektu Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp ; inti; samp(char *title); voidset_i(intii) i = ii; intget_i() return i; ~samp(); samp::samp(char *title) cout<< "Konstructor: " << title<< "\n"; i=0; W4 Język C++ 1

samp::~samp() cout << "destruktor\n"; samp fun() samp ret("fun"); ret.set_i(10); //funkcje zmienia wartość składowej i i zwraca obiekt return ret; int _tmain(int argc, _TCHAR* argv[]) samp ob("main"); cout << ob::i = << ob.get_i() << endl; ob = fun(); cout << ob::i = << ob.get_i() << endl; return 0; WYDRUK: ob::i = 0 ob::i = 10 W4 Język C++ 2

Gdy funkcja zwraca obiekt, automatycznie tworzony jest obiekt tymczasowy, przeznaczony jest dla przechowywania zwracanej wartości. Po zwróceniu wartości obiekt ten jest niszczony. Jeśli obiekt ten zawiera destruktor, to destruktor będzie wywołany przy niszczeniu obiektu, deklarowanego lokalnie w funkcji, a również przy niszczeniu obiektu tymczasowego. W pewnych sytuacjach może to powodować nieoczekiwane efekty uboczne. Jeśli destruktor zwalnia pamięć, alokowaną dynamicznie, to pozostanie ona zwolnioną podczas pierwszego wywołania destruktora. Kolejne wywołania destruktora powodują zwolnienie pamięci już zwolnionej rujnowanie systemu dynamicznego wydzielenia pamięci PAGE FAULT. Podobna sytuacja powstaje, jeśli inicjowanie obiektu jest związane z otwarciem lub tworzeniem pliku, a niszczenie obiektu z zamknięciem lub kasowaniem pliku. Przykłady: W3_1, W3 Rozwiązaniem tego problemu jest definiowanie konstruktora kopiującego oraz przeciążenie operatora przypisania. W4 Język C++ 3

Funkcje zaprzyjaźnione Na praktyce mogą występować sytuacji, kiedy są potrzebne funkcje, które nie są metodami klasy przecież mają dostęp do składowych prywatnych (private, protected) klasy. Takie funkcje są nazywane funkcjami zaprzyjaźnionymi. Prototyp takiej funkcji umieszczamy w deklaracji klasy, poprzedzając go kluczowym słowom friend. Istnieje kilka sytuacji, w których użycie funkcji zaprzyjaźnionych jest użyteczne. Popierwsze, przy przeciążeniu pewnych operatorów. Po-drugie, przy zrealizowaniu pewnych operacji wejścia \ wyjścia. Po-trzecie jeśli kilka klas zawierają składowe, powiązane z innymi elementami programu. Pierwsze dwa przypadki będziemy rozważali później. Teraz trzeci przypadek. Przykład W5: W4 Język C++ 4

W tym przykładzie funkcje comp_col jest zwykłą funkcją, która dostaje obiekty dwóch różnych klas car i wagon i musi porównywać wartości zmiennych prywatnych tych klas. int comp_kol(car c, wagon w) if(w.nkol > c.nkol) return 1; else if(w.nkol == c.nkol) return 0; else return -1; Żeby udostępnić tą funkcje zmienne prywatne tych klas, w deklaracji każdej klasy dołączamy prototyp tej funkcji z słowom kluczowym friend: class car ; int nkol; //ilosc kol void set_nkol(int nk) nkol = nk; int get_nkol() return nkol; friend int comp_kol(car c, wagon w); //funkcia zaprzyjaźniona do klasy car W4 Język C++ 5

class wagon int nkol; //ilosc kol ; void set_nkol(int nk) nkol = nk; int get_nkol() return nkol; friend int comp_kol(car c, wagon w); //funkcia zaprzyjaźniona do klasy wagon Funkcje comp_kol w liście argumentów formalnych ma nazwe klas car, wagon. Przynajmniej dla jednej z tych klas nazwa typu będzie spotkana wcześniej deklaracji odpowiedniej klasy. Żeby kompilator wiedział o istnieniu takiej klasy, używamy deklaracje zapowiadającą(referencje zapowiadającą) //deklaracje zapowiadająca (referencje zapowiadająca) class wagon; //deklaracje klasy car class car int nkol; //ilosc kol ; void set_nkol(int nk) nkol = nk; int get_nkol() return nkol; friend int comp_kol(car c, wagon w); //funkcia zaprzyjaźniona do klasy car W4 Język C++ 6

Funkcje comp_kol nie jest metodą klasy, dla tego odwołanie do zmiennych prywatnych jest dokonywane przez nazwę klasy: w.nkol, c.nkol. Przypominamy, że metody klasy mają dostęp bezpośredni do składowych prywatnych tej klasy (nkol =, ). Inne funkcje (nie metody klasy i nie funkcje zaprzyjaźnione) nie mają dostępu bezpośredniego do składowych prywatnych, te składowe są udostępnione przez odpowiednie funkcje-metody klasy (set_nkol( ), get_nkol()). Funkcje zaprzyjaźnione mają dostęp bezpośredni do prywatnych składowych klasy, przecież dostęp ten odbywa się przez nazwę klasy. Wywołanie funkcji zaprzyjaźnionej odbywa się dokładnie tak samo, jak i funkcji zwykłej (nie metody klasy): comp_kol(c1, w1). Nie jest ta funkcja powiązaną z żadną klasą, więc jej wywołanie nie idzie przez nazwę obiektu. Funkcje zaprzyjaźnione nie dziedziczą się(nie jest metodą klasy). Jeśli takie funkcje są w deklaracji klasy bazowej, nie mają oni wpływu na klasę pochodną. Funkcje mogą być zaprzyjaźnione do kilkach klas. Funkcje może być metodą jednej klasy i funkcją zaprzyjaźnioną dla drugiej klasy: W4 Język C++ 7

#include "stdafx.h" #include <iostream> using namespace std; //deklaracje zapowiadająca (referencje zapowiadająca) class wagon; //deklaracje klasy car class car int nkol; //ilosc kol ; void set_nkol(int nk) nkol = nk; int get_nkol() return nkol; int comp_kol(wagon w); //metoda klasy car //deklaracje klasy wagon class wagon int nkol; //ilosc kol ; void set_nkol(int nk) nkol = nk; int get_nkol() return nkol; friend int car::comp_kol(wagon w); //funkcia zaprzyjaźniona do klasy wagon W4 Język C++ 8

int car::comp_kol(wagon w) /*=============================================================================== Zwraca 1, jesli ilosc kol wagonowych wieksza od ilosci kol samochoda, 0 - jesli sa rowne, -1 - odwrotnie ================================================================================*/ if(w.nkol > nkol) return 1; else if(w.nkol == nkol) return 0; else return -1; int _tmain(int argc, _TCHAR* argv[]) car c1; wagon w1; c1.set_nkol(6); w1.set_nkol(8); cout << "sprawdzenie: " << c1.comp_kol(w1) << "\n"; system("pause"); return 0; W4 Język C++ 9

Jeśli funkcja-metoda jednej klasy występuje jako funkcja zaprzyjaźniona dla drugiej klasy, to w deklaracji drugiej klasy trzeba dołączyć: friend typ_wartości_zwracanej nazwa_pierwszej_klasy :: nazwa_funkcji (lista_argumentów); W4 Język C++ 10