Prezentacja do C++
Download
Report
Transcript Prezentacja do C++
T: Różnice pomiędzy programowaniem
strukturalnym a obiektowym
1.
2.
3.
4.
Programowanie strukturalne jest
paradygmatem (podstawą, fundamentem)
programowania.
W programowaniu strukturalnym stosuje się
moduły, które to komunikują się ze sobą
odpowiednio zaplanowanymi interfejsami.
Kod programu dzielony jest na funkcje
wywołane z jej parametrami, dzięki czemu
nie korzystają ze zmiennych globalnych.
Jako struktury algorymiczne stosuje się:
sekwencję operacji, funkcję warunkową,
pętle (iterację) oraz rekurencję.
Podstawą programowania obiektowego jest
wprowadzenie pojęcia obiektu. Wewnątrz,
którego wyróżniamy jego atrybuty oraz
metody.
Najważniejsza cechy programowania
obiektowego:
1.
2.
◦
◦
◦
◦
abstrakcja,
hermetyzacja,
dziedziczenie,
polimorfizm.
Abstrakcja – każdy obiekt to pewien model,
który wykonuje pewne prace, opisuje i
zmienia swój stan oraz komunikuje się z
innymi obiektami.
◦ przykład z człowiekiem jako mężczyzną i kobietą.
Hermetyzacja - enkapsulacja (ukrywanie
implementacji) – zapewnia, że obiekt nie
może zmienić stanu atrybutów innych
obiektów w nieoczekiwany sposób, a jedynie
metody są uprawnione do zmiany jego stanu.
Dziedziczenie - nazywamy mechanizm
współdzielenia metod między klasami, klasa
może dziedziczyć po innej klasie, oznacza to,
że oprócz swoich własnych atrybutów oraz
metod, uzyskuje także te pochodzące z klasy,
z której dziedziczy.
Polimorfizm - to cecha dzięki której jeden
interfejs może być stosowany do wykonania
różnych zadań.
◦ przykład z metodą daj_głos dla klasy pies i kot
Programowanie strukturalne wykorzystuje
funkcje, te funkcje pracują na pewnych
zmiennych i oddają wynik. Jednak nie
komunikują się między sobą.
Programowanie obiektowe grupuje zmienne i
metody w jedną całość, czyli obiekt.
Wywołanie metody powoduje zmianę stanu
obiektu, jego atrybutów. W podejściu
obiektowym zmienne powiązane są logicznie
ze sobą tak jak w rzeczywistości. Zmiana
jednego atrybutu może zmienić wartość
innego.
T: Obiektowość jako podstawa naturalnego
postrzegania świata
Wszystko może być obiektem.
◦
◦
◦
◦
◦
◦
◦
◦
drzewa,
kwiaty,
rzeki,
domy,
miasta,
ludzie,
samochód
…
Zanim stworzymy jakiś obiekt, trzeba ustalić
czym ten obiekt będzie. W zależności od
tego, czy chcemy stworzyć wirtualny
samochód, czy motor, należy określić dwie
rzeczy:
◦ jakie atrybuty będzie miał ten obiekt,
◦ jakie będzie miał metody działania.
T: Definicje klas i obiektów.
Klasa to byt programistyczny określający
jakie atrybuty i metody będą miały obiekty,
które zostaną utworzone na jej podstawie.
Aby „ożywić” klasę, należy utworzyć jej tak
zwaną instancję – czyli po prostu utworzyć jej
obiekt.
T: Przykłady odwzorowania rzeczywistości w
kategoriach obiektów
Ćwiczenia praktyczne
T: Opracowanie obiektowego opisu
przykładowego programu
Ćwiczenia praktyczne
T: Definiowanie klas, składniki klasy
class NaszaNazwaKlasy {
… // pola i metody składowe klasy
};
class NazwaKlasy {
public:
//specyfikator dostępu
//definiowanie pól
int poleInt;
float poleFloat;
//deklarowanie metod
int Metoda1();
void Metoda2();
};
class bryla
{
public:
float a,b,h;
float ObliczObjetosc();
};
//definicja metody poza definicją klasy
float bryla::ObliczObjetosc()
{
return a*b*h;
}
class bryla
{
public:
float a,b,h;
//definicja metody wewnątrz klasy
float ObliczObjetosc() {
return a*b*h;
};
};
T: Definiowanie obiektów, odwoływanie się
do składowych obiektu
NazwaKlasy Obiekt;
// deklaracja wskaźnika do obiektu
NazwaKlasy *ObiektWsk = new NazwaKlasy;
//przypisanie wartości
Obiekt.poleInt = 0;
Obiekt.poleFloat = 9.04;
//wywołanie metody obiektu
Obiekt.Metoda1();
//przypisanie wartości
ObiektWsk->poleInt = 0;
ObiektWsk->poleFloat = 9.04;
//wywołanie metody obiektu
ObiektWsk->Metoda1();
delete ObiektWsk;
bryła.cpp
T: Hermetyzacja danych
Polega na ukrywaniu metod i atrybutów dla
klas zewnętrznych.
Dostęp do metod i atrybutów możliwy jest
tylko z wewnątrz klasy, do której one należą
lub z klas zaprzyjaźnionych i klas
dziedziczących.
Poziom dostępności do metod i atrybutów
można regulować za pomocą modyfikatorów.
Modyfikatory:
◦ public - pozwala na wolny, nieograniczony dostęp
do atrybutów z dowolnej, innej klasy,
◦ private - dostęp do atrybutów tylko i wyłącznie dla
klasy, której są elementami,
◦ protected - atrybuty będą dostępne jedynie dla
bieżącej klasy oraz dla wszystkich klas po niej
dziedziczących.
bank.cpp
T: Konstruktory i dekonstruktory
Jest specyficzną funkcją, która jest
wywoływana zawsze gdy tworzony jest
obiekt.
Jeśli programista nie utworzy go, kompilator
automatycznie utworzy konstruktor, który nic
nie robi.
Możemy stworzyć własny konstruktor, który
będzie posiadła stworzone przez nas
własności np. będzie inicjował wartości
atrybutów obiektu.
class przykładowa
{
public:
// deklaracja atrybutów
przykładowa (typ argument) {
// nazwa konstruktora identyczna
jak nazwa klasy
// ciało konstruktora
};
};
class samochod
{
public:
string marka, model;
samochod () {
marka=”brak”;
model=”brak”;
};
samochod (string m1, string m2) {
marka=m1;
model=m2;
};
};
Oczekuje się by obiekt po utworzeniu był w
pełni gotowy do użycia. Aby to spełnić
konstruktor powinien dokonywać pełnej
inicjalizacji wszystkich atrybutów/danych w
obiektach.
Sposób inicjalizacji może zależeć od sposobu
konstrukcji samego obiektu.
Informacji potrzebnych do inicjalizacji
składowych obiektu nie można podawać w
miejscu ich definicji, lecz muszą one stanowić
nierozłączną część konstruktora.
class samochod
{
public:
string marka, model;
samochod (string m1, string m2)
: marka(m1), model(m2) {
// po dwukropku znajduje się
lista inicjalizacyjna
};
};
Podczas życia obiektu rezerwujemy pamięć, którą
chcielibyśmy zwolnić zawsze po usunięciu
obiektu.
Pierwszym wariantem jest pamiętanie o
wywołaniu funkcji, która będzie za to
odpowiedzialna. Takie podejście jest niezalecane
i ryzykowne, ponieważ bardzo łatwo zapomnieć o
wywoływaniu tej funkcji.
Zalecanym rozwiązaniem jest wykorzystanie
destruktorów. Destruktor jest specjalną funkcją,
która jest wywoływana zawsze tuż przed
zniszczeniem (usunięciem) obiektu z pamięci.
class samochod
{
public:
string marka, model;
samochod () {};
// inne atrubuty i metody
~samochód () {
// ciało destruktora
};
};
T: Zagnieżdżona definicja klasy
W C++ można umieścić deklarację klasy w
innej klasie.
Klasą zagnieżdżoną to klasa zadeklarowana w
jej wnętrzu.
Funkcje składowe klasy zewnętrznej mogą
tworzyć obiekty klasy zagnieżdżonej i używać
ich.
Na zewnątrz klasa wewnętrzna jest widoczna
jeśli umieszczona została w sekcji public.
class samochod
{
public:
string marka, model, rocznik;
samochod () {…};
class mechanik // klasa zagnieżdżona
{
string imię;
mechanik () {…};
};
};
T: Przeładowanie operatorów i nazw funkcji
Język C++ umożliwia tworzenie wielu metod
o tej samej nazwie w ramach jednej klasy.
Aby program wiedział, której metody użyć w
danym momencie, muszą one się różnić
typem lub liczbą argumentów.
przeciążanie (ang. overloading).
Przeładowywanie operatorów, jest to
definiowanie operatorów dla własnych typów.
Można tego dokonać w większości
przypadków jako metodę.
+
*
/
% // operator
modulo
^
&
~
!
= // gdy go
nie zdefiniujemy robi
to za nas
kompilator
<
>
+=
-=
*=
/=
%=
^=
&=
|=
<<
>>
>>=
<<=
==
!=
<=
>=
&&
||
++
-, // gdy go nie
zdefiniujemy robi to
za nas
kompilator
->*
->
() // operator
wywołania
funkcji
[]
new //
ponizsze
operatory
gdy ich nie
zdefiniujem
y robi to za
nas
kompilator
new[]
delete
delete[]
wektor.cpp
T: Zaprzyjaźnione funkcje klasy
Funkcja zaprzyjaźniona z klasą to funkcja,
która mimo, że nie należy do klasy posiada
pełny dostęp do wszystkich składników tej
klasy.
wektor2.cpp