25
Programowanie obiektowe Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka

Programowanie obiektowe 2013/2014

  • Upload
    donoma

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

Programowanie obiektowe 2013/2014. Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka. Dostęp do składników prywatnych. int main () { punkt A; A.wpisz (); return 0; } - PowerPoint PPT Presentation

Citation preview

Page 1: Programowanie obiektowe 2013/2014

Programowanie obiektowe

Łukasz SztangretKatedra Informatyki Stosowanej i ModelowaniaPrezentacja przygotowana w oparciu o materiały

Danuty Szeligi i Pawła Jerzego Matuszyka

Page 2: Programowanie obiektowe 2013/2014

Dostęp do składników prywatnych

int main(){ punkt A; A.wpisz(); return 0;}void wypisz(punkt &A){

cout<<"x = "<<A.x<<endl;cout<<"y = "<<A.y<<endl;

}

class punkt{

double x,y;public:

void wpisz();};void punkt::wpisz(){

cin>>x>>y;}void wypisz(punkt &A);

BŁĄDFunkcje nie będące składnikami klasy

nie mają dostępu do ich składników

prywatnych

Page 3: Programowanie obiektowe 2013/2014

Dostęp do składników prywatnych

int main(){ punkt A; A.wpisz();

A.wypisz(); return 0;}

class punkt{

double x,y;public:

void wpisz();void wypisz();

};void punkt::wpisz(){

cin>>x>>y;}void punkt::wypisz(){

cout<<"x = "<<x<<endl;cout<<"y = "<<y<<endl;

}

Page 4: Programowanie obiektowe 2013/2014

Funkcja zaprzyjaźniona

int main(){ punkt A; A.wpisz();

wypisz(A); return 0;}void wypisz(punkt &A){

cout<<"x = "<<A.x<<endl;cout<<"y = "<<A.y<<endl;

}

class punkt{

double x,y;public:

void wpisz();friend void wypisz(punkt

&A);};void punkt::wpisz(){

cin>>x>>y;}void wypisz(punkt &A);

Funkcja zaprzyjaźniona z klasą to funkcja, która madostęp do wszystkich zmiennych składowych klasy.

Page 5: Programowanie obiektowe 2013/2014

Funkcja zaprzyjaźniona

class kolo;class punkt{

double x,y;public:

void wpisz();friend bool czy(punkt &,kolo &);

};class kolo{

double x,y,r;public:

void wpisz();friend bool czy(punkt &,kolo &);

};void punkt::wpisz(){

cin>>x>>y;}void kolo::wpisz(){

cin>>x>>y>>r;}

bool czy(punkt &A, kolo &K){

if (sqrt(pow(A.x-K.x,2)+pow(A.y-K.y,2))<=K.r)return true;

return false;}int main(){

punkt A;kolo K;A.wpisz();K.wpisz();cout << czy(A,K) <<endl;return 0;

}

Page 6: Programowanie obiektowe 2013/2014

Klasy zaprzyjaźnione

class punkt{

double x,y;};class kolo{

punkt O;double r;

public:void wpisz();

};void kolo::wpisz(){

cin>>O.x>>O.y>>r;}

class punkt{

friend class kolo;double x,y;

};class kolo{

punkt O;double r;

public:void wpisz();

};void kolo::wpisz(){

cin>>O.x>>O.y>>r;}

BŁĄDFunkcja wypisz nie

ma dostępu do składników

prywatnych klasy punkt

Page 7: Programowanie obiektowe 2013/2014

Klasy zaprzyjaźnione

1. Przyjaźń jest jednostronna.Jeżeli klasa A deklaruje przyjaźń z klasą B to klasa A nie jest automatycznie traktowana przez klasę B jak przyjaciel.

2. Przyjaźń nie jest przechodnia.Jeżeli klasa A zadeklaruje przyjaźń z klasą B, klasa B zadeklaruje przyjaźń z klasą C to klasa C nie jest traktowana przez klasą A jak przyjaciel.

3. Przyjaźń nie jest dziedziczna.Jeżeli klasa A deklaruje przyjaźń z klasą B, a klasa C jest potomkiem klasy A to klasa C nie traktuje klasy B jako przyjaciela.

Page 8: Programowanie obiektowe 2013/2014

Modyfikator static

Modyfikator static użyty przy definiowaniu składnika klasy sprawia, że ten składnik jest wspólny dla wszystkich obiektów klasy.

Page 9: Programowanie obiektowe 2013/2014

Modyfikator static

class ulamek{ int l; static int m;public:

void wypisz(); void zmien();

};int ulamek::m=1;void ulamek::wypisz(){

cout<<l<<"/"<<m<<endl;}void ulamek::zmien(){

cin>>l>>m;}

int main(){ ulamek A,B; A.zmien();

A.wypisz();B.zmien();B.wypisz();A.wypisz();

cout<<sizeof(A);}

1 2

1/2

3 4

3/4

1/4

4

Page 10: Programowanie obiektowe 2013/2014

Funkcje statyczne

#include<iostream>using namespace std;class punkt{ double x,y; static int ruch;public: punkt(); punkt(double, double, int); void wypisz(); void przesun(double, double); static void pozwolenie() {ruch=!ruch;}};int punkt::ruch=0;punkt::punkt(){x=0;y=0;ruch=0;}punkt::punkt(double a, double b, int c){x=a;y=b;ruch=c;}

void punkt::wypisz(){cout<<"x = "<<x<<endl;cout<<"y = "<<y<<endl;}void punkt::przesun(double a, double b){if (ruch) {x=x+a;y=y+b;}}int main(){ punkt A(1,1,0); punkt B(2,2,0); A.przesun(1,2); A.wypisz(); punkt::pozwolenie(); //A.pozwolenie(); A.przesun(1,2); A.wypisz(); B.przesun(1,2); B.wypisz(); return 0;}

Page 11: Programowanie obiektowe 2013/2014

Funkcje statyczne

1. Do funkcji statycznej nie jest przekazywany wskaźnik this => (nie) można odwoływać się do zwykłych składników klasy.

static void pozwolenie(punkt &A) {ruch=!ruch;A.x=-A.x;}};

2. Funkcje statyczne można wywoływać na rzecz klasy (nie tylko na rzecz konkretnego jej obiektu).

Page 12: Programowanie obiektowe 2013/2014

Stałe obiekty

class ob{

double w_x,w_y; string kol;public: void wypisz(); void przesun(double, double); void pomaluj(string kolor);};void ob::pomaluj(string kolor){kol=kolor;}void ob::wypisz(){

cout<<"x = "<<w_x<<endl;cout<<"y = "<<w_y<<endl;cout<<"kolor: "<<kol<<endl;}

void ob::przesun(double a, double b){w_x+=a;w_y+=b;}

int main(){

ob samochod={1,1,"szary"};ob dom={2,2,"zielony"};

samochod.przesun(1,2); samochod.wypisz(); dom.przesun(5,5);

dom.wypisz(); return 0;}

Page 13: Programowanie obiektowe 2013/2014

Stałe obiekty

class ob{

double w_x,w_y; string kol;public: void wypisz(); void przesun(double, double); void pomaluj(string kolor);};void ob::pomaluj(string kolor){kol=kolor;}void ob::wypisz(){

cout<<"x = "<<w_x<<endl;cout<<"y = "<<w_y<<endl;cout<<"kolor: "<<kol<<endl;}

void ob::przesun(double a, double b){w_x+=a;w_y+=b;}

int main(){

ob samochod={1,1,"szary"};const ob dom={2,2,"zielony"};

samochod.przesun(1,2); samochod.wypisz();

dom.przesun(5,5); dom.wypisz(); return 0;}

BŁĄDBŁĄD

Page 14: Programowanie obiektowe 2013/2014

Stałe obiekty

class ob{

double w_x,w_y; string kol;public: void wypisz() const; void przesun(double, double); void pomaluj(string kolor);};void ob::pomaluj(string kolor){kol=kolor;}void ob::wypisz() const{

cout<<"x = "<<w_x<<endl;cout<<"y = "<<w_y<<endl;cout<<"kolor: "<<kol<<endl;}

void ob::przesun(double a, double b){w_x+=a;w_y+=b;}

int main(){

ob samochod={1,1,"szary"};const ob dom={2,2,"zielony"};

samochod.przesun(1,2); samochod.wypisz(); dom.wypisz(); return 0;}

Page 15: Programowanie obiektowe 2013/2014

Stałe obiekty

class ob{

double w_x,w_y; string kol;public: void wypisz() const; void przesun(double, double); void pomaluj(string kolor) const;};void ob::pomaluj(string kolor) const{ kol=kolor;}void ob::wypisz() const{

cout<<"x = "<<w_x<<endl;cout<<"y = "<<w_y<<endl;cout<<"kolor: "<<kol<<endl;}

void ob::przesun(double a, double b){w_x+=a;w_y+=b;}

int main(){

ob samochod={1,1,"szary"};const ob dom={2,2,"zielony"};

samochod.przesun(1,2); samochod.wypisz();

dom.pomaluj("czerwony"); dom.wypisz(); return 0;}

BŁĄD

Page 16: Programowanie obiektowe 2013/2014

Stałe obiekty

class ob{

double w_x,w_y; mutable string kol;public: void wypisz() const; void przesun(double, double); void pomaluj(string kolor) const;};void ob::pomaluj(string kolor) const{ kol=kolor;}void ob::wypisz() const{

cout<<"x = "<<w_x<<endl;cout<<"y = "<<w_y<<endl;cout<<"kolor: "<<kol<<endl;}

void ob::przesun(double a, double b){w_x+=a;w_y+=b;}

int main(){

ob samochod={1,1,"szary"};const ob dom={2,2,"zielony"};

samochod.przesun(1,2); samochod.wypisz();

dom.pomaluj("czerwony"); dom.wypisz(); return 0;}

Page 17: Programowanie obiektowe 2013/2014

Wskaźnik do składnika klasy

1. Te specjalne wskaźniki mogą pokazywać na niestatyczne i publiczne składniki klasy.

2. Nie pokazują na żadne konkretne miejsce w pamięci (jak zwykłe wskaźniki). Mówią ile komórek za początkiem klasy znajduje się składnik.

Page 18: Programowanie obiektowe 2013/2014

Wskaźnik do składnika (danej) klasy

class klasa{public:

int a;};

DEFINICJA:int klasa::*wsk; - wsk jest wskaźnikiem mogącym

pokazywać we wnętrzu klasy klasa na obiekt typu int

wsk=&klasa::a; - ustawienie wskaźnika na składową klasy klasa o nazwie a

Page 19: Programowanie obiektowe 2013/2014

Wskaźnik do składnika (danej) klasy

class klasa{public:

int a;int *w;

};int main(){

klasa A;A.a=1;A.w=&A.a;klasa *W;W=&A;int klasa::*wsk_a;wsk_a=&klasa::a;int *klasa::*wsk_w;wsk_w=&klasa::w;

}

0045FE580045FE5B0045FE5C0045FE5F0045FE600045FE630045FE640045FE670045FE680045FE6B

WA.aA.wwsk_awsk_w

0045FE5C1

0045FE5C04

Page 20: Programowanie obiektowe 2013/2014

Wskaźnik do składnika(danej) klasy

A.*wsk_a*(A.*wsk_w)W->*wsk_a*(W->*wsk_w)

18 ::

17

++ -- POST () [] . ->typ(wyrażenie) static_cast<typ>(wyrażenie)

const_cast<typ>(wyrażenie)dynamic_cast<typ>(wyrażenie)

reinterpret_cast<typ>(wyrażenie)16 ++ -- PRE + - ! ~ * & (typ) wyrażenie15 .* ->*14 * / %13 + -12 << >>11 < <= > >=10 == !=9 &8 ^7 |6 &&5 ||4 ? :3 = *= /= %= += -= <<= >>= &= |= ^=21 ,

0045FE580045FE5B0045FE5C0045FE5F0045FE600045FE630045FE640045FE670045FE680045FE6B

WA.aA.wwsk_awsk_w

0045FE5C1

0045FE5C04

Page 21: Programowanie obiektowe 2013/2014

Wskaźnik do składnika (danej) klasy

class klasa{public:

int a;int *w;

};int main(){

klasa A,*W;W=&A;A.w=&A.a;int klasa::*wsk_a;wsk_a=&klasa::a;int *klasa::*wsk_w;wsk_w=&klasa::w;

A.a=1;cout<<A.*wsk_a<<endl;W->a=2;cout<<W->*wsk_a<<endl;*A.w=3;cout<<*W->w<<endl;*(A.*wsk_w)=4;cout<<*(W->*wsk_w)<<endl;return 0;

}

1

2

3

4

Page 22: Programowanie obiektowe 2013/2014

Wskaźnik do składnika (funkcji) klasy

class klasa{public:

int wart;void wpisz(int a){wart=a;}void przes(int a){wart+=a;}void wyp(){cout<<wart<<endl;}

};void (klasa::*wsk[2])(int); - wsk jest dwuelementową tablicą

wskaźników mogących pokazywać we wnętrzu klasy klasa na funkcję wywoływaną z parametrem typu int i zwracającej typ void.

wsk[0]=&klasa::wpisz; - ustawienie na funkcję wpisz.(A.*wsk[0])(1); - wywołanie na rzecz obiektu A. Do funkcji

przesłano wartość 1.

Page 23: Programowanie obiektowe 2013/2014

Wskaźnik do składnika (funkcji) klasy

class klasa{public:

int wart;void wpisz(int a){wart=a;}void przes(int a){wart+=a;}void wyp(){cout<<wart<<endl;}

};

int main(){

klasa A;A.wart=5;void (klasa::*wsk[2])(int);wsk[0]=&klasa::wpisz;wsk[1]=&klasa::przes;A.wyp();(A.*wsk[0])(1);A.wyp();(A.*wsk[1])(2);A.wyp();return 0;

}

5

1

3

Page 24: Programowanie obiektowe 2013/2014

Przykładclass klasa{public:

int a,b;};int main(){

klasa A={1,2},B={3,4};int klasa::*wsk;wsk=&klasa::a;cout<<A.*wsk<<‘\t’<<B.*wsk<<endl;wsk=&klasa::b;cout<<A.*wsk<<‘\t’<<B.*wsk<<endl;return 0;

}

1 32 4

Page 25: Programowanie obiektowe 2013/2014

Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie:http://creativecommons.org/licenses/by-sa/3.0/deed.pl