zesp

Transkrypt

zesp
Tematyka wykładów
1.
Wprowadzenie. Klasy – cz. 1
2.
Klasy – cz. 2
3.
4.
5.
6.
7.
8.
Funkcje operatorowe. Wskaźnik this
Dziedziczenie
Polimorfizm i funkcje wirtualne
Szablony
Strumienie
Tworzenie aplikacji w systemie Windows
- Język C++. Programowanie obiektowe
- Klasy i obiekty
- Budowa i deklaracja klasy. Prawa dostępu
- Pola i funkcje składowe
- Konstruktor i destruktor
- Tworzenie obiektów
- Konstruktor kopiujący. Pola tworzone
statycznie i dynamicznie
- Funkcje zaprzyjaźnione
- Składowe statyczne
Funkcje zaprzyjaźnione
Zaprzyjaźnienie - mechanizm specyficzny dla języka C++.
Funkcja zaprzyjaźniona z klasą to funkcja „zewnętrzna”
zadeklarowana za pomocą słowa kluczowego friend.
Może to być:
• funkcja „globalna” nie należąca do żadnej klasy
• funkcja składowa należąca do innej klasy
class kolo
{
public:
void oblicz1();
friend void oblicz2(kolo k);
friend void punkt::oblicz3(kolo k);
private:
float r;
};
void kolo::oblicz1()
{ …… }
void oblicz2(kolo k)
{
……
}
class punkt
{
public:
void oblicz3(kolo k);
};
Funkcje zaprzyjaźnione
Cechy funkcji zaprzyjaźnionej:
• nie należy do klasy, nie jest składową klasy
• wniosek 1: kwalifikatory dostępu (public, private, protected) nie
•
•
•
•
•
mają znaczenia
wniosek 2: nie można odwołać się do funkcji zaprzyjaźnionej
poprzez nazwę kwalifikowaną (wyjątek: f. składowa innej klasy)
wniosek 3: nie można jej aktywować na rzecz obiektu klasy
z którą jest zaprzyjaźniona
ma takie same prawa dostępu do sekcji prywatnej i chronionej
jak funkcja składowa – inny mechanizm tego dostępu
sens zaprzyjaźnienia:
 funkcja otrzymuje jako argument obiekt klasy z którą
jest zaprzyjaźniona
 funkcja zwraca jako wynik działania obiekt klasy z którą jest
zaprzyjaźniona
funkcja może być zaprzyjaźniona z wieloma klasami
(obiekty tych klas są argumentami funkcji)
Funkcje zaprzyjaźnione
class zesp
{
public:
zesp();
zesp(float a, float b);
private:
float re, im;
};
zesp::zesp()
{
re = im = 0;
}
zesp::zesp(float a, float b)
{
re = a; im = b;
}
Zadanie: klasę zesp należy uzupełnić o operację
wypisania liczby zespolonej na ekranie.
Rozwiązanie 1
FUNKCJA SKŁADOWA KLASY (FUNKCJA UDOSTĘPNIAJĄCA)
class zesp
{
public:
zesp();
zesp(float a, float b);
float get_re();
float get_im();
private:
float re, im;
};
funkcje udostępniające
tzw. gettery
zesp::zesp()
{
re = im = 0;
}
zesp::zesp(float a, float b)
{
re = a; im = b;
}
float zesp::get_re()
{ return re; }
float zesp::get_im()
int main()
{ return im; }
{
zesp x(2, 5);
cout << ‘(‘ << x.get_re() << ‘,‘ << x.get_im() << ‘)‘;
return 0;
}
Rozwiązanie 2
FUNKCJA SKŁADOWA KLASY (DEDYKOWANA DLA ZADANIA)
class zesp
{
public:
zesp();
zesp(float a, float b);
void wypisz();
private:
float re, im;
};
int main()
{
zesp x(2, 5);
x.wypisz();
return 0;
}
zesp::zesp()
{
re = im = 0;
}
zesp::zesp(float a, float b)
{
re = a; im = b;
}
void zesp::wypisz()
{
cout << ‘(‘ << re << ‘,‘;
cout << im << ‘)‘;
}
Rozwiązanie 3
FUNKCJA ZAPRZYJAŹNIONA Z KLASĄ
class zesp
{
public:
zesp();
zesp(float a, float b);
friend void wypisz(zesp z);
private:
float re, im;
};
int main()
{
zesp x(2, 5);
wypisz(x);
return 0;
}
zesp::zesp()
{
re = im = 0;
}
zesp::zesp(float a, float b)
{
re = a; im = b;
}
void wypisz(zesp z)
{
cout << ‘(‘ << z.re << ‘,‘;
cout << z.im << ‘)‘;
}
Funkcje zaprzyjaźnione
PRZEKAZANIE ARGUMENTU
void wypisz1(zesp z)
{
cout << ‘(‘ << z.re << ‘,‘;
cout << z.im << ‘)‘;
}
class zesp
{
public:
zesp();
zesp(float a, float b);
void wypisz2(zesp *z)
friend void wypisz1(zesp z); {
friend void wypisz2(zesp *z);
cout << ‘(‘ << z->re;
friend void wypisz3(zesp &z);
cout << ‘,‘ << z->im << ‘)‘;
}
private:
float re, im;
};
int main()
{
zesp x(2, 5);
wypisz1(x); wypisz2(&x);
return 0;
}
void wypisz3(zesp &z)
{
cout << ‘(‘ << z.re << ‘,‘;
cout << z.im << ‘)‘;
}
wypisz3(x);
Funkcja składowa a zaprzyjaźniona
zesp zesp::dodaj1(zesp z)
{
zesp wynik;
Funkcja składowa
wynik.re = re + z.re;
wynik.im = im + z.im;
return wynik;
}
return zesp(re + z.re, im + z.im);
zesp dodaj2(zesp z1, zesp z2)
{
zesp wynik;
Funkcja zaprzyjaźniona
wynik.re = z1.re + z2.re;
wynik.im = z1.im + z2.im;
return wynik;
}
return zesp(z1.re + z2.re, z1.im + z2.im);
Porównanie
Funkcja składowa
klasy
deklaracja
definicja
wywołanie
(aktywacja)
zesp dodaj1(zesp z);
Funkcja zaprzyjaźniona
z klasą
friend zesp dodaj2(zesp z1,
zesp z2);
zesp zesp::dodaj1(zesp z) zesp dodaj2(zesp z1, zesp z2)
{
{
zesp wynik;
zesp wynik;
wynik.re = re+z.re;
wynik.re = z1.re + z2.re;
wynik.im = im+z.im;
wynik.im = z1.im + z2.im;
return wynik;
return wynik;
}
}
zesp a, b, c;
c = a.dodaj1(b);
zesp a, b, c;
c = dodaj2(a, b);
Funkcje zaprzyjaźnione
Po co są funkcje zaprzyjaźnione skoro pozwalają uzyskać
ten sam efekt jaki umożliwiają funkcje składowe?
Cechy funkcji zaprzyjaźnionej – ciąg dalszy:
• dziedziczenie: funkcja zaprzyjaźniona nie jest dziedziczona
• przeciążanie operatorów: funkcje składowe nie pozwalają
przeciążać niektórych operatorów w specyficzny sposób –
konieczny jest inny mechanizm (funkcje zaprzyjaźnione)
• mechanizm zaprzyjaźnienia: zaprzyjaźnianie całych klas