Programowanie obiektowe, wyklad2, Obiekty i klasy


Obiekty i klasy

// DEFINICJA KLASY

class TV {

0x08 graphic
int program;

0x08 graphic
bool wlaczony;

public:

// INTERFEJS KLASY

// konstruktor domyślny - przypisanie wartości początkowych składowym prywatnym

TV() {program=2; wlaczony=false;}

// metody klasy

void zmienProgram(int p) // zmiana składowej prywatnej

{ if (wlaczony) program=p; }

void wlacz(void) // zmiana składowej prywatnej

{ wlaczony=true; }

void wylacz(void) // zmiana składowej prywatnej

{ wlaczony=false; }

};

//

// KLIENT KLASY

int main ()

{

TV kuchniaTV;

kuchniaTV.zmienProgram(4);

kuchniaTV.wlacz();

kuchniaTV.zmienProgram(4);

}

Elementy składowe klasy:

  1. Nadać nazwę klasie.

  2. Dodać do klasy pola danych.

  3. Dodać do klasy metody (prototypy funkcji), które będą manipulowały wewnętrznymi danymi klasy.

  4. Dodać do klasy konstruktor.

  5. Zdefiniować kody metod i konstruktora.

  6. Utworzyć moduł główny, w który tworzone będą obiekty danej klasy i opisane będzie ich działanie.

ad. 1 Nadanie nazwy klasie

#include <iostream.h>

class Figura

{

// klasa jest na razie pusta

};

int main()

{

return 0;

}

ad. 2 Dodanie do klasy pól danych

#include <iostream.h>

class Figura

{

// pola danych są prywatne

private:

int dlugosc;

int szerokosc;

int powierzchnia;

};

int main()

{

return 0;

}

ad 3 Dodanie do klasy metod

class Figura

{

// pola danych są prywatne

private:

int dlugosc;

int szerokosc;

int powierzchnia;

// metody są publiczne

public:

void ObliczPow(void);

void DrukujPow(void);

};

int main()

{

return 0;

}

ad 4. Dodanie do klasy konstruktora

class Figura

{

// pola danych są prywatne

private:

int dlugosc;

int szerokosc;

int powierzchnia;

// metody są publiczne

public:

Figura(int d=0, int s=0); //konstruktor jest publiczny

void ObliczPow(void);

void DrukujPow(void);

};

int main()

{

return 0;

}

ad 5. Zdefiniowanie metod i konstruktora

#include <iostream.h>

class Figura

{

private:

int dlugosc;

int szerokosc;

int powierzchnia;

public:

Figura(int d=0, int s=0);

void ObliczPow(void);

void DrukujPow(void);

};

void Figura::ObliczPow(void)

{

powierzchnia=dlugosc*szerokosc;

}

void Figura::DrukujPow(void)

{

cout << "Powierzchnia wynosi : "<<powierzchnia;

}

Figura::Figura(int d, int s)

{

dlugosc=d;

szerokosc=s;

}

main()

{

return 0;

}

ad 6 . Funkcja główna - utworzenie obiektów i

#include <iostream.h>

class Figura

{

private:

int dlugosc;

int szerokosc;

int powierzchnia;

public:

prostokat(int d=0, int s=0);

void ObliczPow(void);

void DrukujPow(void);

};

void Figura::ObliczPow(void)

{

powierzchnia=dlugosc*szerokosc;

}

void Figura::DrukujPow(void)

{

cout << "Powierzchnia wynosi : "<<powierzchnia<<endl;

}

Figura::Figura(int d, int s)

{

dlugosc=d;

szerokosc=s;

}

main()

{

int x,y;

cout << "Podaj dlugosc: ";

cin >> x;

cout << "Podaj szerokosc: ";

cin >> y;

Figura a(x,y); // utwórz prostokąt a

a.ObliczPow(); // oblicz powierzchnię prostokąta a

a.DrukujPow(); // drukuj powierzchnię prostokąta a

return 0;

}

#include <iostream.h>

#include <math.h>

class Ulamek

{ int l; // licznik

int m; // mianownik

int nwp(int p, int q); // największy wspólny podzielnik

public:

Ulamek(int a=0, int b=1) // Konstruktor

{ int q=nwp(a,b);

if(b < 0) q = -q; // mianownik ma być zawsze dodatni

l = a/q;

m = b/q;

}

int ZwrocLicznik()const { return l; }

int ZwrocMian()const { return m;}

};

int Ulamek::nwp(int p, int q)

{ int r;

p = abs(p); // obliczenia na wartościach nieujemnych

q = abs(q);

// Przypadki szczególne

if(p == 0) if(q == 0) return 1; else return q;

else if(q == 0) return p;

// p>0, q>0

r = p % q;

while(r) { p = q; q = r; r = p % q; }

return q;

}

int main ()

{

Ulamek f0, f1(1), f2(6,3), f3(f2);

cout << "TEST KLASY Ulamek\n";

cout << f0.ZwrocLicznik() << '/' << f0.ZwrocMian() << endl;

cout << f1.ZwrocLicznik() << '/' << f1.ZwrocMian() << endl;

cout << f2.ZwrocLicznik() << '/' << f2.ZwrocMian() << endl;

cout << f3.ZwrocLicznik() << '/' << f3.ZwrocMian() << endl;

return 0;

}

class Stos {

private:

int* s; // wierzchołek stosu

int n; // liczba elementów stosu

public:

void Odloz(int element);

int Zdejmij(void);

bool jestPusty() const;

// konstruktor

Stos(int maxEl);

};

Stos::Stos(int maxE)

{

s = new int[maxE]; // przydziel potrzebną pamięć

if (s==0) // sprawdź, czy została przydzielona pamięć

exit(1);

n=0;

}

bool Stos::jestPusty() const

{

return n==0;

}

void Stos::Odloz(int element)

{

s[n++]=element;

}

int Stos::Zdejmij(void)

{

return s[--n];

}

#include <iostream.h>

#include <string.h>

#include <ctype.h>

int main (int argc, char *argv[])

{

char *a=argv[1];

int n=strlen(a);

Stos A(n);

cout << argv[1]<<endl;

for (int i=0; i<n; i++)

{

if (a[i]=='+')

A.Odloz(A.Zdejmij() + A.Zdejmij());

if (a[i]=='*')

A.Odloz(A.Zdejmij() * A.Zdejmij());

if (isdigit(a[i]))

A.Odloz(0);

while (isdigit(a[i]))

A.Odloz(10*A.Zdejmij() + (a[i++]-'0'));

}

cout << A.Zdejmij() << endl;

return(0);

}

Zliczanie obiektów

czyli

statyczne pola danych i statyczne funkcje

#include <iostream.h>

class Punkt

{ int x, y;

static int licznik; // Zmienna statyczna: licznik punktów

public:

Punkt (int, int);

~Punkt();

void Wyswietl();

// Funkcja statyczna: zwraca wartość typu int, liczbę punktów

static int LiczbaPkt();

};

// Przypisanie wartości początkowej zmiennej statycznej

int Punkt::licznik=0;

Punkt::Punkt(int xx, int yy) // Konstruktor

{ x=xx;y=yy;

licznik++; // Aktualizacja licznika gdy tworzony jest nowy

// punkt czyli wywoływany konstruktor

}

Punkt::~Punkt() // Destruktor

{ licznik--; } // Aktualizacja licznika gdy usuwany jest

// punkt czyli wywoływany destruktor

void Punkt::Wyswietl()

{ cout<<" Wspolrzedne punkt " << x << " " << y << "\n"; }

int Punkt::LiczbaPkt()

{ return licznik; }

int main() {

cout << "Poczatkowa ilosc punktow: "

Punkt::LiczbaPkt() << endl;;

Punkt a(0,0), b(1,1);

cout << "Liczba punktow po inicjacji obiektow: "

<<Punkt::LiczbaPkt()<<endl;;

a.Wyswietl();

b.Wyswietl();

}

Klasy zagnieżdżone

class Stos

{

private:

struct wezel

{ int el;

wezel *nast;

wezel (int x, wezel *t;

{ el=x; nast=t;}

};

typedef wezel *lacze;

lacze glowa;

public:

void Wstaw(int x)

{ glowa = new wezel(x,glowa);}

int Zdejmij(void)

{ int v=glowa->el;

lacze t=glowa->nast;

delete glowa;

glowa = t;

return v;

}

bool Pusty() const { return glowa==0; }

Stos(int) { glowa = 0;}

};

Szczegóły techniczne

Klasa

class nazwa_klasy

{

private: // pola danych i funkcje prywatne

typ nazwa_zmiennej;

...

public: // pola danych i funkcje publiczne

typ nazwa_funkcji();

...

protected: // pola danych i funkcje chronione

...

};

struct S { ...};

jest po prostu skrótem zapisu

class S { public: ... };

class Punkt

{

private:

float x; // współrzędna x punktu

float y; // współrzędna y punktu

public:

Punkt (float, float); // konstruktor

void Drukuj(); // wyświetlanie współrzędnych

};

Składowe klasy

class MojaKlasa

{

private: // pola danych i funkcje prywatne

...

public: // pola danych i funkcje publiczne

// ta funkcja jest definiowana w ciele klasy

void Fun1(int a)

{

// instrukcje funkcji

}

// ta funkcja jest tylko deklarowana w ciele klasy,

// jest to zapowiedź funkcji, której definicja

// znajduje się na zewnątrz klasy

void Fun2(int, int);

...

};

// Definicja funkcji Fun2

void MojaKlasa::Fun2(int a, int b)

{

// instrukcje funkcji

}

Obiekty

// definicja zmiennej

int x; // definicja zmiennej x

class Punkt {

// tutaj definicja składowych klasy Punkt

...

};

// definicja obiektów

Punkt a; // definicja punktu a

// czyli obiektu a klasy Punkt

Punkt b,c; // definicja punktów b i c (dwóch obiektów)

Punkt a; // deklaracja obiektu a

a.Drukuj(); // wywołanie metody Drukuj na rzecz obiektu a

Konstruktory

Punkt a(1,1), b(a); // definicja obiektu b za pomocą a

funkcja(a); // przekazanie obiektu a do funkcji

c=funkcja(); // zwrócenie obiektu z funkcji

Konstruktor inicjujący

class MojaKlasa

{

public:

MojaKlasa(); // konstruktor bez parametrów

// nazywany jest domyślnym

MojaKlasa(int n); // konstruktor może mieć parametry

...

};

int main()

{

MojaKlasa a; // deklaracja obiektu:

// wywołany zostanie konstruktor domyślny

MojaKlasa b(2); // deklaracja obiektu:

// wywołany zostanie konstruktor z jednym

// parametrem

}

class MojaKlasa

{

public:

MojaKlasa(int n=0);

...

};

int main()

{

MojaKlasa a; // wywołany zostanie konstruktor z n=0

MojaKlasa b(2); // wywołany zostanie konstruktor z n=2

}

Tworzenie obiektów z przypisanymi wartościami początkowymi

class X

{

int a,b;

public:

X(int i, int j) {a=i; b=j};

};

class X

{

int a,b;

public:

X(int i, int j): a(i), b(j) {}

};

nazwa_klasy nazwa_obiektu = nazwa_klasy(wartości zmiennych)

Jeśli występuje tylko jeden argument, zapis ten można uprościć:

nazwa_klasy nazwa_obiektu = wartość_zmiennej

nazwa_klasy nazwa_obiektu(wartości zmiennych)

class X

{

int i;

public:

X(); // konstruktor domyślny - bez parametrów

X(int x); // konstruktor z jednym parametrem

X(int x, int y) // konstruktor z dwoma parametrami

};

int main()

{

X a; // wywołany konstruktor domyślny

X b(1); // użyty konstruktor X::X(int)

X c=1; // użyty konstruktor X::X(int)

X d(1,1); // użyty konstruktor X::X(int, int)

X d=X(1,1); // użyty konstruktor X::X(int, int)

}

Destruktor

class MojaKlasa

{

public:

MojaKlasa(int n=0); // konstruktor

~MojaKlasa(); // destruktor

...

};

Konstruktor kopiujący

Punkt(Punkt &);

Punkt(const Punkt &);

class X

{

int i;

public:

X(); // konstruktor inicjujący

X(int x, int y) // konstruktor inicjujący

X(const X&); // konstruktor kopiujący

};

int main()

{

X a; // użyty konstruktor inicjujący

X d(1,1); // użyty konstruktor inicjujący

X d=X(1,1); // użyty konstruktor inicjujący

X e(a); // użyty konstruktor kopiujący X::X(const X&)

X d=a; // użyty konstruktor kopiujący X::X(const X&)

}

Metody jako funkcje wewnętrzne

Metody typu const

void jakasFunkcja() const;

// Funkcja przypisuje punktowi współrzędne podane

// jako parametry wywołania:

// jej zadaniem jest zmiana składowych klasy,

// zatem nie może być zadeklarowana jako const

void UstawPunkt(int x, int x);

//

// Funkcja drukuje współrzędne punktu, na rzecz którego

// została wywołana:

// czyta składowe, ale ich nie zmienia,

// może zatem być zadeklarowana jako const

void DrukujPunkt(void) const;

Statyczne pola danych i statyczne funkcje

class MojaKlasa

{

static int licznik; // deklaracja zmiennej

// ze słowem static

...

public:

MojaKlasa(int n=0);

...

};

int MojaKlasa::licznik=1; // inicjalizacja zmiennej

// bez słowa static

class MojaKlasa

{

static int licznik; // deklaracja zmiennej

// ze słowem static

...

public:

...

static int IleObiektow(); // deklaracja funkcji

// statycznej

...

};

int MojaKlasa::licznik=1; // inicjalizacja zmiennej

// bez słowa static

int IleObiektow() // definicja funkcji statycznej

{

return licznik;

}

1

21

Wykład 2.

domyślnie są to składowe prywatne



Wyszukiwarka