- W Boga - wierze. Natomiast nie bardzo wierzę w to, co ludzie mówią o Bogu.
[ Pobierz całość w formacie PDF ]
prof. Jan Bielecki
Visual C++ 6.0
Programowanie obiektowe
9. Klasy pierwotne
10. Klasy pochodne
11. Metody wirtualne
12. Projektowanie kolekcji
13. Studium projektowe
Dodatki
Błędy programowania
Klasy pierwotne
Za przykład klasy pierwotnej niech posłuży klasa definiująca pojęcie liczba zespolona. Jak wiadomo (albo nie!), liczba zespolona jest uporządkowaną parą liczb rzeczywistych. Do zapisu liczby zespolonej o składnikach a i b używa się notacji
a + bi
o tak dobranym i, że i2 = -1.
Stąd łatwo już wynika, że
(a+bi) + (c+di) == (a+c) + (b+d)i
oraz że
(a+bi) * (c+di) == (a*c - b*d) + (a*d + b*c)i
Składnik a jest nazywany częścią rzeczywistą (re), a składnik b częścią urojoną (im) liczby zespolonej.
#include <iostream.h>
struct Cplx {
double re, im;
};
Cplx add(Cplx &parL, Cplx parR);
int main(void)
{
Cplx one = { 1.0, 3.0 },
two = { 2.0, 4.0 };
Cplx sum = add(one, two);
char *plus = "+";
if(sum.im < 0)
plus = "";
cout << sum.re << plus << sum.im << 'i' << endl;
return 0;
}
Cplx add(Cplx &parL, Cplx parR)
{
double re = parL.re + parR.re,
im = parL.im + parR.im;
Cplx sum = { re, im };
return sum;
}
Definicja typu strukturowego Cplx jest opisem pojęcia liczba zespolona. Egzemplarzami typu są zmienne one, two i sum.
Program wyznacza sumę dwóch liczb zespolonych i wyprowadza ją w postaci 3 + 7i.
Hermetyzacja
Przytoczone rozwiązanie ma tę wadę, że inicjowanie i przetwarzanie zmiennych struktury Cplx jest uciążliwe, a każdy użytkownik klasy może bez ograniczeń posługiwać się nazwami jej pól re i im.
Dlatego podczas definiowania klas stosuje się hermetyzację. Polega ona na tym, że słowo kluczowe struct zastępuje się słowem class, a zestawy składników klasy umieszcza w sekcjach private (prywatny), public (publiczny) i protected (chroniony).
Uwaga: Typy zadeklarowane z użyciem słowa kluczowego class są nazywane klasami, a opisane przez nie zmienne są nazywane obiektami. Różnica między typami obiektowymi i strukturowymi polega jedynie na domniemaniach hermetyzacji. Dlatego każdy obiekt jest strukturą, a każda struktura jest obiektem.
dla dociekliwych
Każda deklaracja
struct Any ...{
// ...
};
jest równoważna deklaracji
class Any ... {
public:
// ...
};
a każda deklaracja
class Any ...{
// ...
};
jest równoważna deklaracji
class Any ... {
private:
// ...
};
a zatem różnice między strukturami i klasami są niemal żadne.
Podział na sekcje
Umieszczenie składnika w sekcji prywatnej oznacza, że będą mogły się nim posługiwać tylko składniki jego klasy oraz funkcje zaprzyjaźnione z jego klasą.
Uwaga: W celu zaprzyjaźnienia funkcji z klasą, należy w dowolnej sekcji klasy umieścić deklarację funkcji poprzedzoną słowem kluczowym friend.
Umieszczenie składnika w sekcji publicznej oznacza, że będą mogły się nim posługiwać wszystkie funkcje i wszystkie składniki.
Umieszczenie składnika w sekcji chronionej oznacza, że będę mogły się nim posługiwać tylko składniki jego klasy, funkcje zaprzyjaźnione z jego klasą oraz składniki jego klasy pochodnej.
Uwaga: Umieszczenie składnika (np. konstruktora albo operatora przypisania) w sekcji prywatnej, uniemożliwia używanie go poza klasą. Ten prosty zabieg funkcjonuje jak zakaz używania wybranych składników klasy.
#include <iostream.h>
class Cplx {
friend Cplx add(Cplx &parL, Cplx parR);
protected:
double re, im;
public:
Cplx(double r, double i) : re(r), im(i)
{
}
void show(void)
{
cout << re << '+' <<
im << 'i' << endl;
}
};
Cplx add(Cplx &parL, Cplx parR)
{
double r = parL.re + parR.re,
i = parL.im + parR.im;
return Cplx(r, i);
}
int main(void)
{
Cplx one(1.0, 3.0),
two(2.0, 4.0);
Cplx sum = add(one, two);
sum.show();
return 0;
}
Składniki re i im są prywatne, a składniki Cplx i show są publiczne.
Funkcja show nie jest składnikiem, ale jako zaprzyjaźniona z klasą Cplx, może odwoływać się do wszystkich jej składników, w tym do prywatnych składników re i im.
Składniki klasy
Składnikami klasy są pola, konstruktory, destruktory i metody. Deklaracja składnika może być umieszczona w sekcji prywatnej, publicznej albo chronionej.
Konstruktory
Konstruktorem jest składnik, który służy do inicjowania elementów struktury. Nazwa konstruktora jest identyczna z nazwą klasy. Deklaracja konstruktora ma postać deklaracji funkcji, ale nie może zawierać określenia typu rezultatu.
class Cplx {
// ...
protected:
double re, im;
public:
Cplx(double r, double i)
{
re = r;
im = i;
}
Cplx(double r)
{
re = r;
im = 0;
}
Cplx(void)
{
re = im = 0;
}
// ...
};
Dzięki zdefiniowaniu konstruktorów stają się poprawne następujące deklaracje
Cplx numA(3,4);
Cplx numB(5);
Cplx numC;
Konstruktor domyślny
Konstruktor, który może być użyty bez podania argumentów jest nazywany domyślnym. Zazwyczaj jest nim konstruktor bezparametrowy.
Uwaga: Jeśli w klasie nie zdefiniuje się ani jednego konstruktora, to jest ona niejawnie wyposażana w konstruktor bezparametrowy o pustym ciele. Jest on wówczas konstruktorem domyślnym.
class Cplx {
// ...
protected:
double re, im;
public:
Cplx(void) // konstrukor domyślny
{
re = im = 0;
}
// ...
};
Argumenty domniemane
...
[ Pobierz całość w formacie PDF ]zanotowane.pldoc.pisz.plpdf.pisz.plslaveofficial.keep.pl