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

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

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.

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wprowadzenie do programowanie obiektowego w języku C++

Plik klasy. h deklaracje klas

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

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

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

Materiały do zajęć VII

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

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

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

dr inż. Jarosław Forenc

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

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

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

Programowanie obiektowe w języku

Programowanie, część I

TEMAT : KLASY POLIMORFIZM

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

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

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 obiektowe w C++ Wykład 12

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

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

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

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

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

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

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

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

Programowanie Obiektowe i C++

Wstęp do Programowania 2

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

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

Podstawy Programowania Obiektowego

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

Programowanie obiektowe

Programowanie, część I

Polimorfizm. dr Jarosław Skaruz

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Projektowanie klas c.d. Projektowanie klas przykład

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Języki i paradygmaty programowania

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

Dziedziczenie jednobazowe, poliformizm

.NET Klasy, obiekty. ciąg dalszy

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Enkapsulacja, dziedziczenie, polimorfizm

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

Programowanie obiektowe i C++ dla matematyków

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

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Wstęp do programowania obiektowego, wykład 7

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

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

Składnia C++ Programowanie Obiektowe, część 3 Mateusz Cicheński

Programowanie obiektowe i C++ dla matematyków

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

Środowisko programistyczne GEANT4

Język C++ wykład VIII

Do czego służą klasy?

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

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

Programowanie Obiektowew języku C++ Zadania L4

Programowanie Obiektowe i C++

tel Konsultacje www

Konstruktor kopiujacy

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Programowanie obiektowe język C++

Owad():waga(1),jadowitosc(false) {cout<<"konstruktor domyslny owada\n";}

Wstęp do Programowania 2

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

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

Wyliczanie wyrażenia obiekty tymczasowe

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

Dziedziczenie & W slajdach są materiały zapożyczone z

Mechanizm dziedziczenia

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

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

Język C++ Programowanie obiektowe

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)

PARADYGMATY PROGRAMOWANIA Wykład 2

Pracownia specjalistyczna. Materiały przygotowali: mgr inż. Wojciech Frohmberg, mgr inż. Michał Kierzynka

Imię i nazwisko: PYTANIA I ODPOWIEDZI Nr 0 EGZAMIN Język C++ 27 czerwca 2011

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

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

Informacja o programowaniu w c++ Dr Maciej Bobrowski

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

Podstawy Programowania Obiektowego

Transkrypt:

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

Klasy i modyfikatory dostępu Przesłanianie metod Polimorfizm Wskaźniki Metody wirtualne Metody abstrakcyjne i interfejsy Przeciążanie operatorów Słowo kluczowe this Konstruktory i destruktory Poza paradygmatem PO Pola statyczne Przyjaciele Dodatkowe informacje Plan zajęć

class Figure { figure.h //pola i metody dostępne tylko dla klasy private: //pola i metody dostępne dla klasy i klas dziedziczących protected: //pola i metody ogólnodostępne public: ; Modyfikatory dostępu

//elementy dziedziczone po klasie nadrzędnej //dostępne tylko dla tej klasy (private) class Rectangle : private Figure { ; rectangle.h //elementy dziedziczone po klasie nadrzędnej rectangle.h //dostępne dla tej klasy i klas dziedziczących (protected) class Rectangle : protected Figure { ; //elementy dziedziczone po klasie nadrzędnej //nie zmieniają typu swojej dostępności class Rectangle : public Figure { ; rectangle.h Modyfikatory dostępu dziedziczenia

class Figure { public: int area(); ; #include figure.h figure.h figure.cpp int Figure::area() { return -1; #include figure.h rectangle.h class Rectangle : public Figure { ; Elementy składowe klasy

#include <iostream> #include figure.h #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Figure figure; Rectangle rectangle; cout << figure.area() << endl; cout << rectangle.area() << endl; return 0; $./main -1-1 output Wykorzystanie klas

#include figure.h class Rectangle : public Figure { protected: int width, height; public: int area(); ; rectangle.h #include rectangle.h rectangle.cpp int Rectangle::area() { return width * height; $./main -1 0 output Przesłanianie metod

#include <iostream> #include figure.h #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Figure figure; Rectangle rectangle; Figure *pointer = NULL; pointer = &figure; cout << pointer->area() << endl; pointer = &rectangle; cout << pointer->area() << endl; return 0; $./main -1-1 output Wskaźniki

Wyrażenie Interpretacja *x Obiekt wskazywany przez x &x x.y x->y (*x).y x[0] x[1] x[n] *(x+n) Adres w pamięci dla x Pole y obiektu x Pole y obiektu wskazywanego przez x jw. Pierwszy obiekt wskazywany przez x Drugi obiekt wskazywany przez x (n+1) obiekt wskazywany przez x jw. Wskaźniki c.d.

class Figure { public: virtual int area(); ; figure.h $./main -1 0 output Metody wirtualne

class Figure { protected: int type; public: virtual int area() = 0; ; #include figure.h figure.h figure.cpp Metody abstrakcyjne (klasy abstrakcyjne)

class IFigure { public: virtual int area() = 0; ; figure.h Interfejsy

#include figure.h rectangle.h class Rectangle : public Figure { protected: int width, height; public: int area(); Rectangle operator + (Rectangle rectangle); ; #include rectangle.h rectangle.cpp int Rectangle::area() { return width * height; Rectangle Rectangle::operator+ (Rectangle rectangle) { Rectangle temp; temp.width = width + rectangle.width; temp.height = height + rectangle.height; return temp; Przeciążenie operatorów

Składnia: typ operator symbol (parametr) { Symbole operatorów do przeciążenia + - * / = < > += -= *= /= << >> <<= >>= ==!= <= >= ++ -- % & ^! ~ &= ^= = && %= [] (), ->* -> new delete new[] delete[] Tabela operatorów do przeciążenia

Wyrażenie Operator Jako metoda klasy @a + - * &! ~ ++ - - A::operator@() Jako funkcja globalna operator@(a) a@ ++ -- A::operator@(int) operator@(a,int) a@b + - * / % ^ & < > ==!= <= >= << >> &&, a@b = += -= *= /= %= ^= &= = <<= >>= [] A::operator@(B) A::operator@(B) operator@(a,b) Przeciążenie wybranych symboli

#include figure.h rectangle.h class Rectangle : public Figure { protected: int width, height; public: Rectangle& operator = (const Rectangle &rectangle); ; #include rectangle.h #include <iostream> rectangle.cpp Rectangle& Rectangle::operator= (const Rectangle &rectangle) { width = rectangle.width; height = rectangle.height; std::cout << Rectangle copy assignment << std:endl; return *this; Słowo kluczowe this

#include <iostream> #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Rectangle rectangle(2,3); Rectangle copy = rectangle; return 0; $./main output Słowo kluczowe this c.d.

#include <iostream> #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Rectangle rectangle(2,3); //Rectangle copy = rectangle; NIE! Rectangle copy; copy = rectangle; return 0; $./main Rectangle copy assignment output Słowo kluczowe this c.d.

class Figure { public: Figure(); virtual int area(); ; #include figure.h figure.h figure.cpp Figure::Figure() { int Figure::area() { return -1; Konstruktor bezargumentowy (domyślny)

#include figure.h rectangle.h class Rectangle : public Figure { protected: int width, height; public: Rectangle(int width, int height); int area(); ; #include rectangle.h rectangle.cpp Rectangle::Rectangle(int width, int height) { this->width = width; this->height = height; int Rectangle::area() { return width * height; Konstruktor z argumentami

#include rectangle.h rectangle.cpp Rectangle::Rectangle(int width, int height) : Figure() { this->width = width; this->height = height; int Rectangle::area() { return width * height; Wywołanie konstruktora klasy nadrzędnej

#include rectangle.h square.h class Square : public Rectangle { public: Square(int width); ; #include square.h #include <iostream> square.cpp Square::Square(int width) : Rectangle(width, width) { Wywołanie konstruktora klasy nadrzędnej c.d.

#include <iostream> #include figure.h #include rectangle.h #include square.h main.cpp using namespace std; int main (int argc, char** argv) { Figure figure; Rectangle rectangle(2,3); Square *square = new Square(2); cout << figure.area() << endl; cout << rectangle.area() << endl; cout << square->area() << endl; return 0; $./main -1 6 4 output Użycie konstruktorów

#include figure.h rectangle.h class Rectangle : public Figure { protected: int width, height; public: Rectangle(int width, int height); Rectangle(const Rectangle &rectangle); ; #include rectangle.h #include <iostream> rectangle.cpp Rectangle::Rectangle(int width, int height) { this->width = width; this->height = height; Rectangle::Rectangle(const Rectangle &rectangle) { width = rectangle.width; height = rectangle.height; std::cout << Rectangle copy constructor << std::endl; Konstruktor kopiujący

#include <iostream> #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Rectangle rectangle(2,3); Rectangle copy(rectangle); return 0; $./main Rectangle copy constructor output Konstruktor kopiujący c.d.

class Figure { public: Figure(); ~Figure(); virtual int area(); ; #include figure.h #include <iostream> figure.h figure.cpp Figure::Figure() { Figure::~Figure() { std::cout << Figure destroyed << std::endl; int Figure::area() { return -1; Destruktor

#include rectangle.h square.h class Square : public Rectangle { public: Square(int width); ~Square(); ; #include square.h #include <iostream> square.cpp Square::Square(int width) : Rectangle(width, width) { Square::~Square() { std::cout << Square destroyed << std::endl; Destruktor c.d.

#include <iostream> #include figure.h #include rectangle.h #include square.h main.cpp using namespace std; int main (int argc, char** argv) { Figure *figure = new Square(2); delete figure; return 0; $./main Figure destroyed output Destruktor wyciek pamięci

class Figure { public: Figure(); virtual ~Figure(); virtual int area(); ; #include figure.h #include <iostream> figure.h figure.cpp Figure::Figure() { Figure::~Figure() { std::cout << Figure destroyed << std::endl; int Figure::area() { return -1; Wirtualny destruktor

#include <iostream> #include figure.h #include rectangle.h #include square.h main.cpp using namespace std; int main (int argc, char** argv) { Figure *figure = new Square(2); delete figure; return 0; $./main Square destroyed Figure destroyed Wirtualny destruktor c.d. output

class Figure { public: Figure(); virtual ~Figure(); static int count; virtual int area(); ; #include figure.h figure.h figure.cpp int Figure::count = 0; Figure::Figure() { count++; Figure::~Figure() { count--; int Figure::area() { return -1; Pola statyczne

#include <iostream> #include figure.h #include rectangle.h main.cpp using namespace std; int main (int argc, char** argv) { Figure figure; Rectangle *rectangle; cout << Figure::count << endl; delete rectangle; cout << Figure::count << endl; return 0; $./main 2 1 output Pola statyczne c.d.

#include rectangle.h square.h class OtherSquare; class Square : public Rectangle { public: Square(int width); ~Square(); friend class OtherSquare; ; Przyjaciele klasy

class Square; othersquare.h class OtherSquare { private: int side; public: void convert(square &square); ; #include othersquare.h #include square.h othersquare.cpp void OtherSquare::convert(Square &square) { side = square.width; Przyjaciele klasy c.d.

class Square; othersquare.h class OtherSquare { private: int side; public: void convert(square &square); friend int getside(othersquare square); ; Przyjaciele funkcje

#include <iostream> #include square.h #include othersquare.h main.cpp using namespace std; int getside(othersquare square) { return square.side; int main (int argc, char** argv) { OtherSquare osquare; Square square(2); osquare.convert(square); cout << getside(osquare) << endl; return 0; $./main 2 Przyjaciele funkcje c.d. output

Domyślny modyfikator dostępu: private Domyślnie dla danej klasy kompilator generuje: konstruktor bezargumentowy, konstruktor kopiujący destruktor operator przypisania (=) z parametrem w postaci implementowanej klasy Ale: definicja dowolnego konstruktora powoduje, że kompilator nie generuje konstruktora bezargumentowego Dodatkowe informacje

W ramach statycznej metody klasy nie można odwoływać się do pól właściwych dla instancji klasy (jedynie do pól statycznych) Pola/metody statyczne w klasie posiadają modyfikatory dostępu Przyjaciel mojego przyjaciela nie jest moim przyjacielem relacja nie jest przechodnia Przyjaciel nie jest relacją symetryczną Dodatkowe informacje c.d.

Pytania? http://bit.ly/oop2014