- 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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • slaveofficial.keep.pl
  • Szablon by Sliffka (© - W Boga - wierze. Natomiast nie bardzo wierzę w to, co ludzie mówią o Bogu.)