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