Programowanie i struktury danych Programowanie i struktury danych
Wykład 1 Wykład 1
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Literatura Literatura
A. Drozdek: C++. Algorytmy i struktury danych.
S. Prata: Język C++. Szkoła programowania.
B. Stroustrup: Język C++.
D. M. Reed, J. Zelle: Data Structures and Algorithms Using Python and C++.
B. Eckel: Thinking in C++. Second edition. Vol. 1.
(http://mindview.net/Books/TICPP/ThinkingInCPP2e.html) S. Lippman, J. Lajoie, B. Moo: C++ Primer. Forth edition.
M. Ben-Ari: Understanding programming languages.
http://cppreference.com http://www.cplusplus.com
Paradygmaty programowania Paradygmaty programowania
● programowanie deklaratywne (powiedz komputerowi co chcesz uzyskać)
● programowanie imperatywne (powiedz komputerowi co ma zrobić)
● programowanie proceduralne (styl bottom-up):
● globalne struktury danych ogólnie dostępne
● zestaw niezależnych funkcji tworzących program
● programowanie obiektowe (styl top-down):
● zabezpieczone i separowane struktury danych («czarna skrzynka»)
● funkcje operujące na własnych strukturach danych (metody)
● programowanie uogólnione/generyczne (statyczny polimorfizm)
● programowanie zorientowane obiektowo (dynamiczny polimorfizm)
● programowanie modularne, zdarzeniowe, aspektowe, ...
Struktury danych w programowaniu Struktury danych w programowaniu
Struktury maszynowe (reprezentacji fizycznej):
● elementarne/wbudowane (zmienne liczbowe, znakowe, adresowe)
● złożone:
● homogeniczne (tablice jedno- i wielowymiarowe, łańcuchy)
● heterogeniczne (struktury/rekordy/obiekty, listy łączone, struktury drzewiaste)
Struktury abstrakcyjne (reprezentacji logicznej):
● sekwencje
● stosy, kolejki
● listy uporządkowane, kolejki priorytetowe, kopce
● zbiory, słowniki (mapy), drzewa, grafy
Typ strukturalny Typ strukturalny
Podejście proceduralne (bez enkapsulacji):
struct Obj //własny typ strukturalny { int a;
float b; //pola struktury }; //średnik jest konieczny
void set(Obj &o, int _a, float _b) //funkcja globalna { o.a = _a; //selekcja pola struktury (operator kropki) o.b = _b;
}
int getA(const Obj &o) //funkcja globalna { return o.a;
}
Obj x; //zmienna strukturalna
set(x, 1, 2.5); //wywołanie funkcji zmieniającej strukturę cout << getA(x); //wywołanie funkcji dla struktury
Typ obiektowy Typ obiektowy
Podejście obiektowe (enkapsulacja):
struct Obj //własny typ obiektowy (klasa) { int a;
float b; //atrybuty klasy
void set(int _a, float _b) //metoda klasy (modyfikator) { a = _a;
b = _b;
} int getA() const //metoda klasy (selektor) { return a;
}};
Obj x; //zmienna obiektowa (instancja klasy)
x.set(1, 2.5); //wywołanie metody dla obiektu
cout << x.getA(); //za pomocą operatora selekcji (kropki) //komunikaty wysyłane do obiektu
Interfejs i implementacja Interfejs i implementacja
Plik obj.h (interfejs – specyfikacja klasy):
#ifndef MY_OBJ_H //zabezpieczenie przed wielokrotnym dołączeniem
#define MY_OBJ_H
struct Obj { int a, b;
void set(int _a, int _b); //prototyp metody };#endif
Plik obj.cpp (implementacja metod klasy):
#include ”obj.h”
void Obj::set(int _a, int _b) //ciało metody { a = _a; b = _b;
}Plik main.cpp (konsumpcja klasy):
#include ”obj.h”
int main()
{ Obj x; //obiekt
x.set(1, 2); //wywołanie metody }
Inicjalizacja obiektów Inicjalizacja obiektów
● konstruktor – specjalna metoda do inicjalizacji atrybutów obiektu
● uruchamiany zawsze przy tworzeniu obiektu
● nazwa metody taka jak nazwa klasy
● możliwe wiele przeciążeń z różnymi parametrami, brak typu wynikowego!
struct Obj
{ int a, b; //od C++11 możliwa inicjalizacja w klasie, np.
//int a = 0;
Obj(int _a = 0, int _b = 0) //konstruktor { a = _a;
b = _b;
}};
Obj x, y(1), z(1,2), v = 3, u = {3,4}; //wywołania konstruktora Obj t[5], *s = new Obj, *p = new Obj[3]; //wielokrotne
Konstruktor domy lny ś Konstruktor domy lny ś
Konstruktor domyślny:
● bez parametrów (lub gdy wszystkie parametry mają wartości domyślne)
● tworzony automatycznie przez kompilator (bez gwarancji inicjalizacji atrybutów obiektu) tylko gdy nie zdefiniowano jawnie żadnego konstruktora
struct Obj { int a, b;
Obj() //konstruktor domyślny { a = 0;
b = 0;
} Obj()=default;//konstruktor domyślny bez inicjalizacji(C++11) };
Obj x, t[5]; //wywołania konstruktora domyślnego Obj *s = new Obj, *p = new Obj[3]; //tu też
Konstruktor domy lny ś Konstruktor domy lny ś
Konstruktor domyślny:
● jeżeli jakikolwiek konstruktor został zdefiniowany, kompilator nie tworzy domyślnego
● w celu ułatwienia wykorzystania klasy należy zawsze zdefiniować konstruktor domyślny
struct Obj { int a, b;
Obj(int _a, int _b = 0) //1- lub 2-parametrowy konstruktor { a = _a;
b = _b;
}};
Obj y(1), z(1, 2); //wywołania konstruktora
Obj x; //brak konstruktora domyślnego – błąd kompilacji!
Konstruktor kopiuj cy ą Konstruktor kopiuj cy ą
Konstruktor kopiujący:
● przyjmuje jako jedyny parametr referencję do obiektu tej samej klasy
● tworzony automatycznie przez kompilator gdy nie zdefiniowano jawnie takiego konstruktora (kopia atrybutów obiektu)
● wywoływany przy przekazywaniu i zwracaniu obiektów w funkcjach
struct Obj { int a, b;
… //inne konstruktory łącznie z domyślnym Obj(const Obj &o) //konstruktor kopiujący { a = o.a;
b = o.b;
}};
Obj x;
Obj y(x), z = x; //wywołania konstruktora kopiującego
Destrukcja obiektów Destrukcja obiektów
● destruktor – specjalna metoda do zwolnienia pamięci zajmowanej przez obiekt
● wywoływany automatycznie gdy zmienna przestaje istnieć (na końcu bloku)
● metoda o nazwie takiej jak nazwa klasy lecz z poprzedzającą tyldą (~)
● możliwy tylko jeden destruktor, brak typu wynikowego!
struct Obj { int a, b;
… //konstruktory łącznie z domyślnym ~Obj() //destruktor
{ ... }
~Obj()=default; //destruktor domyślny (C++11) };
{ Obj x, *p = new Obj; //wywołania konstruktora
delete p; //jawne wywołanie destruktora (obiekt *p) } //niejawne wywołanie destruktora (obiekt x)
Destrukcja obiektów Destrukcja obiektów
Destruktory obiektów:
● tworzone automatycznie przez kompilator gdy nie zostaną jawnie zdefiniowane (destruktor domyślny nie zwalnia pamięci dla atrybutów klasy alokowanych dynamicznie za pomocą operatora new)
● uruchamiane w kolejności odwrotnej do kolejności tworzenia obiektów (wywołań odpowiednich konstruktorów)
{ Obj x, *p = new Obj, z;
{ Obj y;
} //destruktor dla obiektu y
delete p; //destruktor dla obiektu *p } //destruktor dla obiektu z i dalej dla x
Metody domy lne ś Metody domy lne ś
Dla każdej klasy kompilator tworzy automatycznie (o ile nie zdefiniowano ich jawnie) następujące metody:
● konstruktor domyślny (bezparametrowy, brak incjalizacji)
● konstruktor kopiujący (kopia atrybutów)
● destruktor (brak zwolnienia dynamicznej pamięci)
● operator przypisania (kopia atrybutów)
struct Obj { int a, b;
};
{ Obj x; //konstruktor domyślny, atrybuty są przypadkowe Obj y = x; //konstruktor kopiujący
x = y; //operator przypisania
} //destruktor domyślny obiektów y i x