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)



Podobne dokumenty
Język C++ Programowanie obiektowe

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

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

Wykład 8: klasy cz. 4

Wskaźniki. Informatyka

Materiały do zajęć VII

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

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

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

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

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

TEMAT : KLASY DZIEDZICZENIE

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

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

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

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

Szablony klas, zastosowanie szablonów w programach

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

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

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

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

Abstrakcyjny typ danych

Dziedziczenie jednobazowe, poliformizm

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

Lab 9 Podstawy Programowania

Szablony funkcji i szablony klas

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

Podstawy Programowania Obiektowego

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Programowanie obiektowe w języku

Wykład 5: Klasy cz. 3

Programowanie Obiektowe i C++

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

PARADYGMATY PROGRAMOWANIA Wykład 3

PARADYGMATY PROGRAMOWANIA Wykład 2

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

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

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

Tablice, funkcje - wprowadzenie

Język C++ zajęcia nr 2

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

Podstawy Programowania Obiektowego

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Programowanie obiektowe w C++ Wykład 12

Programowanie, część I

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

Wstęp do Programowania 2

Programowanie Obiektowo Zorientowane w języku c++ Konstruktory

Języki i paradygmaty programowania

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

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

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

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

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.

Rozdział 4 KLASY, OBIEKTY, METODY

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Definicje klas i obiektów. Tomasz Borzyszkowski

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

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Słownik programisty: Struktury jako typy abstrakcyjne

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

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

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

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

Programowanie w języku C++

Wstęp do programowania

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

Programowanie, część I

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

Programowanie obiektowe

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

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

Do czego służą klasy?

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

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

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

KLASY cz.1. Dorota Pylak

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

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

Programowanie Obiektowe i C++

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Do czego służą klasy?

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

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

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

Transkrypt:

Różnice między C i C++ (Rozszerzenia C++) Nowe słowa kluczowe class, delete, new, friend,... Komentarze /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza) Wskaźniki typu void W C wskaźniki dowolnego typu mogą być przydzielane do wskaźników typu void i odwrotnie. W C++ wymagana jest jawna konwersja. void *temp; char *tekst = "Hej!"; temp = (void *) tekst; tekst = (char*) temp; J.Jezierski, M.Masewicz, R.Wrembel 1

Typ wyliczeniowy C++ zmiennej danego typu wyliczeniowego można przypisać jedynie stałą należącą do definicji tego typu. W C++ przy deklaracji zmiennych typu wyliczeniowego można pominąć słowo enum. W C++ można definiować lokalne typy wyliczeniowe (w obrębie struktur lub klas) enum boolean (FALSE, TRUE}; boolean b = TRUE; // OK b = 0; // błąd!!! J.Jezierski, M.Masewicz, R.Wrembel 2

Deklaracje zmiennych W C++ deklaracja jest typem instrukcji. Można deklarować zmienne w dowolnym miejscu programu. main() { printf("poczatek\n"); int temp = 3; for (int i = 0; i < 10; i++) {... } } W C++ przy deklaracji zmiennych typów strukturalnych można pominąć słowo struct. W C++ struktury i unie są klasami W C++ skok lokalny goto nie może przeskakiwać deklaracji (chyba że deklaracje są umieszczone w zagnieżdżonym bloku programu) J.Jezierski, M.Masewicz, R.Wrembel 3

Domyślne argumenty funkcji void fun(int a, int b = 2, int c = 3) { printf("a=%d\nb=%d\nc=%d\n",a,b,c); } main() { fun(1); // fun(1, 2, 3) fun(1,1); // fun(1, 1, 3) fun(1,1,1); // fun(1, 1, 1) } program 18.cpp J.Jezierski, M.Masewicz, R.Wrembel 4

Przeciążanie funkcji Definiowanie zbioru funkcji o tej samej nazwie, różniących się liczbą i/lub typem parametrów void fun(int a) {... } void fun(float a) {... } Uwaga! Przeciążanie funkcji w połączeniu z argumentami domyślnymi może prowadzić do niejednoznaczności błędu. void fun(int a) {... } void fun(int a, int b = 0) {... } main() { } fun(1); //????? - błąd J.Jezierski, M.Masewicz, R.Wrembel 5

Referencja W C++ można tworzyć tzw. zmienne referencyjne. Jeśli zadeklarujemy zmienną referencyjną do innej zmiennej, to jakiekolwiek zmiany wartości dowolnej z powiązanych w ten sposób zmiennych będą odnosiły się również do drugiej z nich. int a = 5; int &b = a; // b jest zmienną referencyjną do a b = 10; // a == 10 && b == 10 a = 20; // a == 20 && b == 20 Referencja jest najczęściej wykorzystywana w funkcjach modyfikujących swoje argumenty. (W C konieczne było w tym celu przekazywanie do funkcji wskaźników do zmiennych) J.Jezierski, M.Masewicz, R.Wrembel 6

Referencja void zamien(int &a, int &b) { int temp; temp = a; a = b; b = temp; } main() { int a = 1, b = 2; zamien(a, b); } // a == 2 && b == 1 J.Jezierski, M.Masewicz, R.Wrembel 7

Dynamiczny przydział pamięci W C++ operatory new i delete W C malloc, calloc, realloc, free, sizeof char *str1, *str2; str1=new char; *str1='a'; str2=new char('b'); char *str3=new char('c'); char *str4; str4=new char(10); if (str4) strcpy(str4, "1234567890"); else cout<<"blad przydzialu pamieci"<<endl; cout<<"str1="<<*str1<<endl; J.Jezierski, M.Masewicz, R.Wrembel 8

Dynamiczny przydział pamięci - 2 float *f; f = new float; *f = 3.14; cout << *f << endl; delete f; int *tab; // tablica dynamiczna tab = new int[10]; // rozmiar tablicy = 10 for (int i = 0; i<10; i++) { tab[i] = i; cout << tab[i] << endl; } delete[] tab; J.Jezierski, M.Masewicz, R.Wrembel 9

Dynamiczne zwalnianie pamięci obiekty utworzone za pomocą new istnieją do momentu ich jawnego usunięcia operatorem delete obiekty takie nie mają nazwy; operowanie na nich tylko za pomocą wskaźników po utworzeniu zawierają śmieci char *str1, *str2; str1=new char; char *str3=new char('c'); str4=new char(10);... delete str1; delete str2; delete str3; // usunięcie dynamicznej tablicy delete[] str4; J.Jezierski, M.Masewicz, R.Wrembel 10

Dynamiczne zwalnianie pamięci - 2 próba usunięcia już usuniętego obiektu operatorem delete kończy się błędem "... access violation..." delete str3;... delete str3; rozwiązanie: zerowanie wskaźnika po jego usunięciu delete str3; str3=null;... delete str3; // lub // if (str3) delete str3; J.Jezierski, M.Masewicz, R.Wrembel 11

Strumieniowe wejście/wyjście Strumienie (iostream.h): wejściowy: cin (klawiatura) wyjściowy: cout (ekran) wyjściowy dla błędów: cerr (ekran) wyjściowy dla błędów: clog (buforowany, ekran) Operatory: >> - wejście << - wyjście Przykłady: 19.cpp, 20,.cpp, 21.cpp, 22.cpp, 23.cpp, 24.cpp, 25.cpp J.Jezierski, M.Masewicz, R.Wrembel 12

Formatowanie strumienia width(l_zn) - liczba znaków do prezentowania liczby na ekranie fill('x') - poprzedzanie liczby ciągiem znaków do długości określonej przez width precision(l_zn) - liczba miejsc dziesiętnych do prezentowania liczb zmiennoprzecinkowych ustawienia obowiązują dla pojedynczej operacji we/wy przykład: 26.cpp J.Jezierski, M.Masewicz, R.Wrembel 13

get(char &c) Odczyt ze strumienia odczyt ze strumienia 1 bajtu (również znak spacji) zwraca referencję do strumienia char c1, c2, c3; cin.get(c1); //1-szy znak do zmiennej c1 // 2-gi znak do zmiennej c3, trzecie do c3 cin.get(c2).get(c3); get() odczyt ze strumienia 1 bajtu (również znak spacji) zwraca odczytany znak char c4; c4=cin.get(); Zadanie: napisać program wczytujący znaki i wyświetlający je na ekranie. Napotkanie Ctrl-Z (EOF) przerywa wczytywanie J.Jezierski, M.Masewicz, R.Wrembel 14

Odczyt ze strumienia - 2 get(char* gdzie, int długość, char ogran='\n') gdzie - adres tablicy do której wpisujemy długość - liczba wczytywanych znaków ogran - znak przerywający wczytywanie zwraca adres strumienia char tekst[10]; cin.get(tekst, sizeof(tekst)); getline(char* gdzie, int dlugość, char ogran='\n') gdzie - adres tablicy do której wpisujemy długość - liczba wczytywanych znaków ogran - znak przerywający wczytywanie do tablicy gdzie trafia również znak przerywający zwraca adres strumienia char tekst[10]; cin.get(tekst, sizeof(tekst), '?'); napotkany znak? kończy wczytywanie tekstu J.Jezierski, M.Masewicz, R.Wrembel 15

Zapis do strumienia put(char) zapis 1 znaku do strumienia write(const char *skąd, int ile) char tekst[10]; cin.get(tekst, sizeof(tekst)); cout.write(tekst+2, 4); int main() //26_1.cpp { char tekst[]="szkolenie C++"; } for (int i=0; i<sizeof(tekst); i++) cout.put(tekst[i]).put(' '); cout<<endl; cout.write(tekst, 9); return 0; J.Jezierski, M.Masewicz, R.Wrembel 16

Programowanie obiektowe Cechy abstrakcyjne typy danych hermetyczność obiektów dziedziczenie polimorfizm Programowanie proceduralne, a obiektowe podejście proceduralne struct Punkt { int x, y;}; void narysuj (struct Punkt P) {// ciało funkcji} podejście obiektowe class Punkt { int x, y; public: void narysuj () {// ciało funkcji}}; J.Jezierski, M.Masewicz, R.Wrembel 17

Klasa podstawowe pojęcie w C++ stanowi obiektowy typ danych definiuje przedmiot, pojęcie, zjawisko dane charakteryzujące przedmiot funkcje określające jego właściwości do tworzenia klasy służą słowa kluczowe: class, struct i union class NazwaKlasy { // ciało definicji klasy } J.Jezierski, M.Masewicz, R.Wrembel 18

Klasa 2 Ciało definicji klasy może zawierać: deklaracje danych składowych deklaracje funkcji składowych (metod) definicje funkcji składowych Klasy można zagnieżdżać: wg obecnie obowiązującego standardu klasy zagnieżdżone mają charakter lokalny w starszych wersjach kompilatorów klasy zagnieżdżone są traktowane na równi z innymi J.Jezierski, M.Masewicz, R.Wrembel 19

Sekcje definicji klasy Składowe klasy rozmieszczone są w sekcjach definicji klasy class Klasa { public: // funkcje i dane składowe publiczne protected: // funkcje i dane składowe zabezpieczone private: // funkcje i dane składowe prywatne }; Odwołania do składowych klasy notacja kropkowa ( -> w przypadku dostępu przez wskaźnik) przykład 27.cpp J.Jezierski, M.Masewicz, R.Wrembel 20

Sekcje definicji klasy prywatna (private) domyślna składowe prywatne są widoczne tylko w obrębie funkcji składowych danej klasy składowe prywatne są stosowane gdy zmiana wartości składowej może być ryzykowna lub gdy składowa ma charakter wewnętrzny (pomocniczy) i dostęp do niej z zewnątrz nie ma sensu zabezpieczona (protected) składowe zabezpieczone są widoczne tylko w obrębie funkcji składowych danej klasy i klas wyprowadzonych (pochodnych) publiczna (public) dostęp do składowych publicznych jest możliwy zarówno z wnętrza jak i spoza klasy J.Jezierski, M.Masewicz, R.Wrembel 21

Klasy: class, struct i union w C++ struktury i unie są klasami w klasach tworzonych słowem class składowe domyślnie są prywatne w klasach tworzonych słowem struct lub union składowe domyślnie są publicznie w przypadku unii istnieje szereg ograniczeń nie występujących w innych typach klas np. unie nie mogą brać udziału w dziedziczeniu J.Jezierski, M.Masewicz, R.Wrembel 22

Zmienna this w każdym obiekcie dostępna jest zmienna this wskazująca na ten obiekt za jej pomocą można zwracać w funkcjach składowych bieżący obiekt (*this) wszystkie odwołania do składowych z wnętrza obiektu są domyślnie poprzedzane this-> class A { int i; public: void ustaw(int x) { i = x; // this->i = x; } }; J.Jezierski, M.Masewicz, R.Wrembel 23

Deklaracje i definicje składowych klas ciała funkcji składowych można umieszczać w klasie lub poza klasą funkcje zdefiniowane w klasie mają domyślnie atrybut inline (przy kompilacji ich wywołanie jest zastępowane ciałem) funkcjom składowym definiowanym poza klasą też można nadać atrybut inline class A { int x, y; public: int fun1(int z) { x = y = z; } void fun2(); void fun3(); }; inline void A::fun2() { x = y; } void A::fun3() { for (...) {... } } J.Jezierski, M.Masewicz, R.Wrembel 24

Składowe statyczne składowe statyczne (static) są wspólne dla wszystkich obiektów danej klasy i istnieją nawet wtedy gdy nie istnieje żaden obiekt klasy statyczne funkcje składowe mogą odwoływać się tylko do składowych statycznych, nie widzą wskaźnika this, nie mogą być wirtualne Przykład: 28.cpp J.Jezierski, M.Masewicz, R.Wrembel 25

Składowe i obiekty stałe i ulotne Składowe stałe i ulotne składowe klas mogą być stałe (const) lub ulotne (volatile) składowe stałe muszą być inicjalizowane w konstruktorach Obiekty stałe i ulotne funkcje uprzywilejowane obiekty klas mogą być stałe lub ulotne na rzecz takich obiektów mogą być wywoływane jedynie tzw. metody uprzywilejowane (posiadające w nagłówku po nawiasie zamykającym listę argumentów słowo kluczowe const lub volatile) J.Jezierski, M.Masewicz, R.Wrembel 26

Konstruktory podczas tworzenia obiektu danej klasy wywoływana jest funkcja zwana konstruktorem konstruktor jest specjalną, najczęściej przeciążoną funkcją wywoływaną zawsze gdy tworzony jest obiekt klasy deklaracja konstruktora nie może zawierać typu zwrotnego konstruktor nie jest wywoływany jawnie wybór konstruktora przy tworzeniu obiektu dokonywany jest na postawie przekazanych parametrów nazwa konstruktora musi być taka sama jak nazwa klasy konstruktory nie są dziedziczone i nie mogą być wirtualne konstruktory muszą być publiczne J.Jezierski, M.Masewicz, R.Wrembel 27

Szczególne typy konstruktorów domyślny (bezargumentowy) - tworzony automatycznie przez kompilator gdy nie zdefiniowano jawnie żadnego konstruktora kopiujący Klasa (const Klasa&) - używany zawsze gdy tworzona jest kopia obiektu (inicjowanie nowego obiektu wzorcowym), domyślnie tworzony jest konstruktor kopiujący, który kopiuje składową po składowej, należy go definiować gdy domyślny działałby nieprawidłowo przykład 28_1.cpp, zadanie 28_2.cpp class Complex { int re, im; public: Complex (int x, int y) : re(x), im(y) {} Complex () {re = im = 0; } Complex (const Complex &c) {re = c.re; im = c.im; } }; J.Jezierski, M.Masewicz, R.Wrembel 28

Destruktor wywoływany niejawnie, gdy obiekt jest niszczony domyślnie tworzony jest destruktor, który nic nie robi należy definiować destruktor, gdy konieczne jest dokonanie porządków po obiekcie np. zwolnienie przydzielonej dynamicznie pamięci nazwa destruktora to nazwa klasy poprzedzona tyldą destruktor nie ma parametrów i typu zwrotnego class samochod { private: float cena; char *nazwa; char *marka; public:... ~samochod();... }; samochod::~samochod() { delete nazwa; delete marka;... }; J.Jezierski, M.Masewicz, R.Wrembel 29

Lista inicjalizacyjna wygodny sposób nadawania początkowych wartości składowym w konstruktorach jedyny sposób inicjowania składowych stałych jedyny sposób inicjowania obiektów złożonych jedyny sposób wywołania konstruktora klasy bazowej w konstruktorze klasy pochodnej class Complex { int re, im; public: Complex (int x, int y) : re(x), im(y) {} }; J.Jezierski, M.Masewicz, R.Wrembel 30

Konstruktory obiektów zawierających podobiekty obiekty składowe tworzone są przez ich konstruktory zanim zacznie działać konstruktor obiektu otaczającego muszą korzystać z listy inicjalizacyjnej, w przeciwnym wypadku dla podobiektów wywołane zostaną ich domyślne konstruktory bezargumentowe destruktory wołane są w odwrotnej kolejności class Kompleksy { Complex c1, c2; public: Kompleksy(int a, int b, int c, ind d) : c1(a, b), c2(c, d) {} }; J.Jezierski, M.Masewicz, R.Wrembel 31

Obiekty globalne, automatyczne, i dynamiczne class Complex { int re, im; public: Complex (int x, int y) : re(x), im(y) {} Complex () {re = im = 0; } Complex (const Complex &c) {re = c.re; im = c.im; } }; //globalny statyczny Complex globalny(3, 6); //globalny dynamiczny Complex *p4=new Complex(1, 1); int main() { // lokalne automatyczne Complex c1(4, -1); Complex c2; // kopiujący <=> c3(c1) Complex c3 = c1; // lokalne dynamiczne Complex *p1, *p2, *p3; p1 = new Complex(4, 7); p2 = new Complex(); p3 = new Complex(*p1); delete p1; delete p2; delete p3; delete p4; return 0; } J.Jezierski, M.Masewicz, R.Wrembel 32

Obiekty globalne, automatyczne, i dynamiczne - 2 globalne zdefiniowane poza funkcjami dostępne z innych plików po zadeklarowaniu (extern) czas życia obiektu -> czas życia programu, konstruktor uruchamiany przed wykonaniem main() lokalne automatyczne tworzone w momencie gdy program napotka ich definicje czas życia -> blok, w którym je zdefiniowano (po wyjściu z bloku są usuwane automatycznie) lokalne statyczne zdefiniowane z wykorzystaniem static czas życia -> czas życia programu zakres widoczności -> blok, w którym je zdefiniowano lokalne dynamiczne tworzone instrukcją new usuwane jawnie instrukcją delete J.Jezierski, M.Masewicz, R.Wrembel 33

Funkcje i klasy zaprzyjaźnione funkcje zaprzyjaźnione z klasą to funkcje, które posiadają dostęp do składowych prywatnych i zabezpieczonych danej klasy, same nie będąc składowymi tej klasy o tym, że dana funkcja jest zaprzyjaźniona z daną klasą informuje deklaracja friend w ciele tej klasy funkcjami zaprzyjaźnionymi mogą być metody innej klasy w przypadku gdy wszystkie metody jednej klasy mają być zaprzyjaźnione z drugą klasą, można uczynić całą pierwszą klasę klasą zaprzyjaźnioną z drugą ta sama funkcja może być zaprzyjaźniona z wieloma klasami brak przechodniości zaprzyjaźnienia zaprzyjaźnienie nie jest dziedziczone J.Jezierski, M.Masewicz, R.Wrembel 34

Funkcje i klasy zaprzyjaźnione - 2 class A { int i, j; public: friend void pokaz(a&); friend void C::f1(); friend class B; }; program 28_3.cpp class B {... void zeruja(a &a) { a.i = a.j = 0; } }; void pokaz(a &a) { cout << a.i << " " << a.j; } J.Jezierski, M.Masewicz, R.Wrembel 35

Funkcje operatorowe pozwalają na przeciążenie istniejących operatorów, tak aby uzyskały znaczenie dla definiowanych przez programistę nowych typów obiektowych nie można zmienić priorytetów ani narności operatorów mogą być definiowane jako metody klasy lub funkcje zewnętrzne (najczęściej zaprzyjaźnione) nazwa funkcji operatorowej jest konkatenacją słowa kluczowego operator i symbolu operatora np. operator=, operator++,... przynajmniej jeden argument wywołania operatora musi być typu zdefiniowanego przez użytkownika, np. operator+(int, float) jest niemożliwe operatory są dziedziczone Przykład: 29.cpp J.Jezierski, M.Masewicz, R.Wrembel 36

Operatory, które można przeciążać new delete new[] delete[] + - * / % ^ & ~! = < > += -= *= /= %= ^= &= = << >> >>= <<= ==!= <= >= && ++ --, ->* -> () [] Zadanie: przeciążyć operator * umożliwiający mnożenie obiektów klasy WEKTOR przez stałą J.Jezierski, M.Masewicz, R.Wrembel 37

Inne operatory [ ] - operator odwołania do elementu tablicy ( ) - operator o znaczeniu nadanym przez programistę, może przyjąć n argumentów, np. obiekt(arg1, arg2, arg3, arg4); obiekt.operator()(arg1, arg2, arg3, arg4); obsługa 4 wymiarowej tablicy; -> - odwołanie się do składnika klasy operatory =, [ ], ( ), -> muszą być niestatycznymi funkcjami składowymi klasy J.Jezierski, M.Masewicz, R.Wrembel 38

Operator << class C1 { public: int a; char *tekst; C1(int p_a, char *p_tekst): a(p_a) { tekst=new char[strlen(p_tekst)+1]; strcpy(tekst, p_tekst);}; ~C1() { delete [] tekst;}; }; ostream & operator<<(ostream &konsola, C1 &p_obj) { konsola<<"obiekt klasy C1=(" } <<p_obj.a<<","<<p_obj.tekst<<")"<<endl; return konsola; program 29_5.cpp void main() { C1 obj1(1, "to jest obiekt 1"); cout<<obj1; } J.Jezierski, M.Masewicz, R.Wrembel 39