Programowanie obiektowe 2013/2014

Post on 22-Mar-2016

40 views 0 download

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

Transcript of 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

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

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;

}

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.

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;

}

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

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.

Modyfikator static

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

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

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;}

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

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;}

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

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;}

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

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;}

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.

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

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

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

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

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.

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

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

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