Programowanie obiektowe, w2wr6, 2


2. Klasy

2.1. Funkcje skadowe i enkapsulacja.

W C++ kiedy deklarujemy zmienne typu struktury - nazwiemy je w dalszym cigu obiektami - deklarujemy na ogó funkcje do manipulowania tymi obiektami. W zoonych programach mamy obiekty wielu typów i kilka funkcji dla kadego typu obiektów. W C++, obsugujce obiekty zdefiniowane przez struktur danego typu moemy wcieli do tej struktury. Poniewa funkcje te s zadeklarowane (lub nawet zdefiniowane) wewntrz klasy, chwyt ten nazywamy enkapsulacj (kapsukowaniem) - funkcje i dane zostay zamknite w "kapsuce".

Poniej mamy przykad takiego programu. W klasie punkt zawarto dwie funkcje

drukpunkt() i ustawpunkt().

// program PUN1

#include <iostream.h>

main()

{

struct punkt

{

float xx, yy;

void ustawpunkt(float x, float y){xx=x; yy=y;}

void drukpunkt() {cout << xx << ' ' << yy << endl;}

};

punkt u,v;

u.ustawpunkt(1.0, 2.0);

u.drukpunkt();

v.ustawpunkt(3.0, 4.0);

v.drukpunkt();

}

Zwrómy uwag na cztery wywoania funkcji w programie. Wywoanie na przykad

u.ustawpunkt(1.0, 2.0)

ma t sam form, co odwoanie si do skadowej u.xx.

Wynikiem programu PUN1 bdzie czwórka liczb:

1 2

3 4

W programie PUN1 obie funkcje ustawpunkt i drukpunkt zostay zdefiniowane wewntrz struktury. Kompilator reaguje wówczas tak samo, jakbymy przed funkcjami umiecili sowo kluczowe inline. Jeli nie chcemy takiego efektu, moemy te funkcje jedynie zadeklarowa wewntrz klasy. Pokazuje to program PUN2.

// Program PUN2

#include <iostream.h>

struct punkt

{

float xx, yy;

void ustawpunkt(float, float);

void drukpunkt();

};

void punkt::ustawpunkt(float x, float y)

{

xx=x;

yy=y;

}

void punkt::drukpunkt()

{

cout << xx << ' ' << yy << endl;

}

main()

{

punkt u,v;

u.ustawpunkt(1.0, 2.0);

u.drukpunkt();

v.ustawpunkt(3.0, 4.0);

v.drukpunkt();

}

Funkcje ustawpunkt i drukpunkt nie s tu funkcjami wewntrznymi. Zauwamy, e w definicjach funkcji pojawi si czon

vector::

jest on niezbdny, by byo jasne, e funkcje s skadowymi struktury punkt. Moemy w zwizku z tym stosowa nazwy xx i yy nie zaznaczajc, e s one skadowymi struktury punkt. Moemy równie - by podkreli, e xx i yy s skadowymi struktury - wykorzysta notacj

this -> xx

this ->yy

Nazwa this jest sowem kluczowym w C++. W funkcji skadowej - metodzie - oznacza ono wskanik do obiektu, z którego ta funkcja zostaa wywoana. Na przykad, przy wywoaniu:

u.drukpunkt();

przy wykonaniu tej funkcji this jest wskanikiem do obiektu u, wic this->xx jest równowany z zapisem u.xx.

Wskanik this jest wskanikiem staym, podobnie jak nazwy tablic. Zatem jeli nasz obiekt jest klasy X, to wskanik this ma typ X const *.

W programie PUN1, typ punkt jest lokalny w funkcji main, w PUN2 nie jest to moliwe, poniewa notacja punkt:: musi by uyta poza t funkcj.

Trzeba jeszcze zauway, e cho wyraenia u.xx oraz u.drukpunkt() wygldaj podobnie istnieje midzy nimi istotna rónica: kady z obiektów u i v posiada swoj skadow liczbow xx, ale oba obiekty wykorzystuj jedn, wspóln funkcj drukpunkt.

2.2. Dostp do skadowych

W programach PUN1 i PUN2 moglibymy odwoywa si do skadników struktury xx i yy. Nie robilimy tego - dostp uzyskiwalimy za porednictwem funkcji ustawpunkt i drukpunkt. Taka sytuacja wystpuje bardzo czsto. Zwaszcza jeli okrelamy bardzo zoony typ zmiennej, korzystne jest sterowanie dostpem do skadowych naszej struktury:

1. Niektóre skadowe, takie jak funkcje ustawpunkt i drukpunkt w programach PUN1 i PUN2, powinny by publiczne. Nale one do tak zwanego interfejsu - "uytkownik" programu musi wiedzie jedynie, jak si nimi posugiwa.

2. Inne skadowe, takie jak xx oraz yy, powinny by prywatne. Nale one do tak zwanej implementacji - uytkownicy nie musz zna szczegóów, musz tylko wiedzie, jakie operacje mog na nich wykona.

Kiedy stosujemy sowo kluczowe struct, wszystkie ich skadowe s domylnie publiczne. Jeli stosujemy sowo kluczowe class, skadowe s domylnie prywatne. Moemy dokadnie sprecyzowa, czego chcemy, stosujc sowa kluczowe public i private. (Jeeli pominiemy oba te sowa pracujc z klas, nie bdziemy mieli dostpu do adnej ze skadowych, co nie ma sensu). Jest to jedyna rónica midzy klasami i strukturami. W deklaracji klasy stosujemy sowa public i private z dwukropkami:

//Program PUN3

#include <iostream.h>

class punkt

{

private:

float xx, yy;

public:

void ustawpunkt(float, float);

void drukpunkt();

};

void punkt::ustawpunkt(float x, float y)

{

xx=x;

yy=y;

}

void punkt::drukpunkt()

{

cout << xx << ' ' << yy << endl;

}

main()

{

punkt u,v;

u.ustawpunkt(1.0, 2.0);

u.drukpunkt();

v.ustawpunkt(3.0, 4.0);

v.drukpunkt();

}

W powyszym programie moglibymy pomin sowo "private:", gdy ta cecha skadników klasy jest domylna.

Moglibymy pewn klas zadeklarowa tak:

class dzika

{

int a;

float b;

void fun1(int);

protected:

char m;

void fun2(void);

public:

int x;

void fun3(char);

private:

int d;

public:

void fun4(void);

};

W powyszym przykadzie nastpujce skadniki klasy s prywatne: a, b, fun1, d, za skadniki publiczne to x, fun3, fun4. wystpuje tutaj jeszcze jedno sowo kluczowe: protected w odniesieniu do skadników m i fun2. Sowa tego uywamy przy dziedziczeniu klas - skadowe opatrzone tym sowem s zastrzeone dla samej klasy i klas potomnych.

Powyszy styl programowania nie jest najlepszy - lepiej jest skadowe o okrelonym dostpie zgrupowa razem.

Uwaga.

W definicjach skadników funkcyjnych klasy nazwa klasy z czterema kropkami to integralna cz nazwy funkcji. Zatem gdy funkcja zwraca wskanik , trzeba pisa:

char *klasakot::mojafunkcja()

{.........}

Gwiazdka powinna by przed pen nazw, a nie przed nazw wewntrzn funkcji w klasie.

Wewntrz klasy (tzn. wewntrz jej funkcji skadowych) pewne skadowe klasy (równie funkcje) moemy zasoni. Trzeba si wówczas do nich odwoywa za porednictwem operatora ::. Ilustruje to nastpujcy przykad:

// program zasl.

#include <iostream.h>

void drukpunkt(); //funkcja globalna

int xx=25.0; //nazwa globalna

class punkt

{

private:

float xx, yy;

public:

void ustawpunkt(float, float);

void drukpunkt();

void demo();

};

void punkt::ustawpunkt(float x, float y)

{

xx=x;

yy=y;

}

void punkt::drukpunkt()

{

cout << xx << ' ' << yy << endl;

}

void punkt::demo()

{

cout << "xx - skladnik klasy = " << xx << endl;

cout << "xx - zmienna globalna = " << ::xx <<endl;

// zaslanianie skladowych

char xx = 'W';

cout << "\nPo zdefiniowaniu zmiennej lokalnej\n";

cout << "xx - zmienna lokalna = " << xx << endl;

cout << "xx - skladnik klasy = " << punkt::xx << endl;

cout << "xx - zmienna globalna = " << ::xx <<endl;

//zaslanianie funkcji

drukpunkt();

int drukpunkt = 7; // zasloniecie nazwy funkcji

punkt::drukpunkt(); // tak wywolujemy

}

main()

{

punkt u,v;

u.ustawpunkt(1.0, 2.0);

u.drukpunkt();

v.ustawpunkt(3.0, 4.0);

v.drukpunkt();

v.demo();

drukpunkt();

}

void drukpunkt()

{

cout << "Ta funkcja nie ma nic wspólnego ze skladnikiem klasy" << endl;

}

Program ten da nastpujce wyniki:

1 2

3 4

xx - skladnik klasy = 3

xx - zmienna globalna = 25

Po zdefiniowaniu zmiennej lokalnej

xx - zmienna lokalna = W

xx - skladnik klasy = 3

xx - zmienna globalna = 25

3 4

3 4

Ta funkcja nie ma nic wspólnego ze skladnikiem klasy

2.3. Skadowa statyczna.

Kady obiekt ma swoje wasne dane, natomiast funkcje zadeklarowane w klasie s wspólne dla wszystkich obiektów tej klasy. Zachodzi potrzeba, by okreli zmienn wspóln dla wszystkich obiektów danej klasy. Zagadnienie to rozwizuje skadowa statyczna.

Deklarujemy tak dan wewntrz klasy, np.:

static int numer;

Deklarujc skadow statyczn w ciele klasy, nie zdefiniowalimy jej jeszcze (nie ma dla niej zarezerwowanego miejsca w pamici). Musimy j zdefiniowa tak jak zmienn globaln - poza wszelkimi funkcjami. Definicja tej skadowej moe zawiera jej inicjalizacj.

int klasa::numer=6;

Inicjalizacja taka moe nastpi nawet wówczas, gdy skadowa jest private. Po inicjalizacji natomiast skadowa statyczna nie moe by odczytywana i zapisywana przez nieuprawnione do tego funkcje.

Do skadowej statycznej moemy odwoa si na trzy sposoby:

klasa::skadowa

obiekt.skadowa jeli istniej ju obiekty danej klasy

wsk->skadowa gdzie wsk jest wskanikiem do dowolnego obiektu danej klasy.

2.4. Statyczne funkcje skadowe.

Funkcje skadowe danej klasy równie mog by statyczne. Su one przede wszystkim do obsugi statycznych skadowych danej klasy. Podobnie jak to ma miejsce w przypadku skadowych statycznych - zmiennych, równie funkcje takie moemy wywoa, nie odwoujc si do konkretnych obiektów, np.:

klasa::funkcja(co)

W funkcji tej nie ma wskanika this - bo funkcja jest wspólna dla wszystkich obiektów danej klasy. Nie moemy si zatem odwoywa bezporednio do nazw skadowych niestatycznych w klasie. Nazwy tych funkcji musimy "wzbogaci" o nazwy obiektów.

Niech bdzie na przykad dana klasa kot i obiekt Mruczek. Niech w klasie kot bdzie funkcja statyczna mruczenie() i niestatyczna skadowa uszy. Niech kot *mr bdzie wskanikiem na obiekt Mruczek.

W ciele funkcji mruczenie() do skadowej uszy musimy si odwoywa tak:

Mruczek.uszy lub

mr->uszy.

Natomiast funkcja mruczenie() "widzi" prywatne skadniki wszystkich obiektów klasy kot.

2.5.Funkcje skadowe typu const oraz volatile.

Deklaracja takich funkcji wyglda na przykad nastpujco:

void kot(void) const;

void pies(void) volatile;

W definicji funkcji te sowa kluczowe stawiamy tu przed nawiasami otwierajcymi ciao funkcji.

Funkcja staa nie moe nic zmienia w obiektach. Funkcja taka moe by wywoana w obiekcie const, w odrónieniu od zwykych funkcji skadowych.

W obiekcie volatile moemy wywoa tylko funkcje volatile. Funkcja moe mie jednoczenie atrybut const i volatile.

Wskaniki do skadowych klas.

Rozpatrzmy deklaracj:

class num

{

public:

float x,y;

} u,v;

Chcemy wykorzysta zmienn wskanikow, by przechowywa adresy skadowych x obiektów u i v, a potem przypisa tym skadowym jakie konkretne wartoci. Moemy to zrobi na przykad tak:

float *p;

p = &u.x; *p = 1;

p = &v.x; *p =2;

Warto wskanika do liczby typu float okrelalimy dwukrotnie. Moemy to wykonac jednokrotnie:

float num::*q; // wskanik do skadowych klasy num typu float.

q = &num::x;

u.*q = 1;

v.*q = 2;

Za pomoc tego wskanika nie moemy co prawda odwoa si do zwykej zmiennej typu float, moemy jednak odwoa si do innych skadowych typu float klasy num:

q = &num::y;

u.*q = 3;

v.*q = 4;

Prócz tego moemy stosowa konstrukcje w rodzaju:

num *pu, *pv;

pu = &u; pv = &v;

pu->*q = 1;

pv->*q = 2;

Do zagadnienia wskaników do skadowych klasy jeszcze powrócimy.

2.6. Konstruktory i destruktory.

2.6.1. Podstawowe wasnoci

Konstruktor to specjalna funkcja skadowa. Funkcja ta zostaje uruchomiona automatycznie w chwili tworzenia obiektu. Nie tworzy ona samego obiektu (nie przydziela pamici na obiekt) - wykonuje jedynie czynnoci, które jej zlecilimy.

Destruktor to równie specjalna funkcja skadowa. Jest uruchomiona automatycznie, gdy obiekt przestaje istnie.

Wasnoci konstruktorów.

1. Konstruktor nazywa si tak jak klasa.

2. Konstruktor nie moe zwraca adnej wartoci.

3. Konstruktor nie moe mie wyspecyfikowanego typu wartoci zwracanej (nawet typu void).

4. Konstruktor nie moe mie atrybutów takich jak const, volatile, static czy virtual.

5. Konstruktor moe by przeadowywany (tzn. w jednej klasie moe by kilka konstruktorów)

6. Nie mona posuy si adresem konstruktora.

Wasnoci destruktorów.

1. Destruktor nazywa si tak jak klasa, ale przed nazw klasy dodajemy znak falk: "~".

2. Destruktor nie zwraca adnej wartoci i nie moe mie specyfikacji nawet typu void.

3. Destruktor nie moe by const, valatile, static ani virtual.

4. Destruktor nie moe mie parametrów, w zwizku z czym nie mona go przeadowa - w klasie moe by co najwyej jeden destruktor.

5. Nie mona posuy si adresem destruktora.

Rozpatrzmy przykad - klas z dwiema skadowymi z danymi:

1. Ze wskanikiem wsk, wskazujcym na cig liczb cakowitych.

2. Ze zmienn cakowit dlug, oznaczajca dugo tego cigu. Zaómy, e zadeklarowalimy klas wiersz z powyszymi skadowymi. Funkcja

void dwawiersze()

{

wiersz r,s;

....

}

stworzy dwa obiekty r i s. Zaómy, e chcemy, by jeden obiekt zawiera cig o dugoci 3, a drugi - cig o dugosci 5. Moemy napisa wewntrz funkcji dwawiersze:

r.wsk = new int[3];

r.dlug = 3;

s.wsk = new int[5];

s.dlug = 5;

Kiedy funkcja skoczy dziaa, zwolni si i automatycznie w pamici miejsce na oba obiekty r i s, ale nie na dwa wskazywane przez nie cigi. Dlatego w funkcji dwawiersze trzeba by wczy dodatkowe dwie instrukcje:

delete r.wsk;

delete s.wsk;

Jest to potencjalne ródo bdów. Znacznie lepiej jest zrealizowa to za pomoc konstruktora i destruktora.

// Program KONSTR. Demonstracja konstruktora i destruktora.

#include <iostream.h>

class wiersz

{

int *wsk, dlug;

public:

wiersz(int = 3);

~wiersz() {delete wsk;}

void drukwiersz(char *);

};

wiersz::wiersz(int n)

{

wsk = new int[n];

dlug = n;

for(int i=0; i<n; i++) wsk[i] = 10*i;

}

void wiersz::drukwiersz(char *nap)

{

cout << nap;

for(int i=0; i<dlug; i++)cout << wsk[i] << ' ';

cout << endl;

}

void dwawiersze()

{

wiersz r, s(5);

r.drukwiersz("r: ");

s.drukwiersz("s: ");

}

main()

{dwawiersze();}

Konstruktor i destruktor klasy wiersz jest woany dwukrotnie. Konstruktor wiersz ma argument domylny 3, który odnosi si do r, gdy w deklaracji

wiersz r, s(5)

r nie ma argumentu. Nie mona zastpi r wyraeniem r(). Konstruktor uruchamiany w takim przypadku jest tak zwanym konstruktorem domniemanym - konstruktorem, który mona wywoa bez adnych argumentów (tzn. konstruktor moe mie na przykad wszystkie argumenty domylne).

Gdyby w powyszym programie nie umieszczono destruktora ~wiersz, wielokrotne tworzenie i usuwanie obiektów mogoby doprowadzi do przepenienia pamici.

2.6.2. Obiekty tworzone dynamicznie.

W programie KONSTR konstruktor wiersz() by wywoany, kiedy deklaracja

wiersza r, s();

stworzya obiekty.

Obiekty mona równie tworzy dynamicznie. W naszym przykadzie moglibymy napisa:

wiersz *r;

co nie prowadzioby do stworzenia obiektu r i wywoania konstruktora obiektu. Obiekt tworzymy instrukcj:

p = new row;

Dopiero wtedy konstruktor jest wywoywany. Podobnie, obiekt jest niszczony (co pociga za sob wywoanie destruktora), instrukcj:

delete p;

2.4.3. Konstruktor jako narzdzie konwersji typów.

Rozpatrzmy program

//Program PUN4

#include <iostream.h>

class punkt

{

float xx, yy;

public:

punkt(float = 0, float =0);

void drukpunkt();

};

punkt::punkt(float x, float y)

{

xx=x;

yy=y;

}

void punkt::drukpunkt()

{

cout << xx << ' ' << yy << endl;

}

main()

{

punkt u(1.0,2.0),v(5);

u.drukpunkt();

v.drukpunkt();

}

Konstruktory s funkcjami, mona wic rozpatrywa wyraenie

punkt(5)

jako wywoanie funkcji. Z drugiej strony, jest to take typowa notacja C++ operatora rzutu, podobna na przykad do

float(5).

Napis punkt(5) tworzy obiekt ze skadowymi xx=5 i yy-0 i obiekt ten jest rezultatem rzutowania. Jednym ze sposobów okrelania konwersji typów dla klas jest po prostu definiowanie waciwych konstruktorów. Porównajmy nastpujce dwa wiersze:

float x; x = float(5);

punkt v; v = punkt(5);

Moemy uproci ten fragment programu, inicjalizujc zmienne u i v w ich deklaracji:

float x = float(5);

punkt v = punkt(5);

lub jeszcze prociej:

float x = 5;

punkt v = 5;

Ta ostatnia deklaracja v jest równowana wyraeniu

punkt v(5);

uytemu w PUN4. Podobnego konstruktora dla typu float nie ma, nie mona wic napisa

float x(5) // NIEPOPRAWNE.

Oto jeszcze jeden kawaek programu:

x =5;

v = 5;

Przypisanie v = 5 jest skrócon form wyraenia v = punkt(5). Widzimy std, e konstruktory przydaj si równie w konwersjach niejawnych. Konwersje takie wystpuj nie tylko w instrukcjach przypisania. Mog si zdarzy na przykad

a) Przy wywoaniu funkcji, której argumentem jest obiekt punkt -f(1).

b) Przy instrukcji return 3; w funkcji, która zwraca punkt.

c) Przy obliczaniu wyrae w których wystpuj przeadowane operatory arytmetyczne.

Uwaga!

punkt v = 5; jest równowany punkt v(5);

punkt v=punkt(7,3); jest równowany punkt v(7,3);

punkt v=(7,3); jest równowany punkt(3);

2.6.4. Lista inicjalizacyjna konstruktora.

Skadow klasy moe by obiekt stay, np.

const int N;

Staa N nie moe by zainicjalizowana w ciele klasy - deklaracja klasy nie tworzy obiektów. Nie mona zatem napisa w ciele klasy: const int N = 45;

Do nadawania wartoci takim zmiennym suy lista inicjalizacyjna konstruktora. Oto przykad tej konstrukcji.

class kot

{

const int N;

float x;

char c;

kot(float, int, char); // konstruktor - deklaracja

}

kot::kot(float xx, int NN, char cc): N(NN), c(cc)

{

x=xx;

} //koniec definicji konstruktora

Lista inicjalizacyjna to to, co znajduje si w definicji konstruktora midzy dwukropkiem po nagówku a nawiasem { otwierajcym ciao konstruktora. Lista skada si z kilku elementów oddzielonych przecinkami. Zapis N(NN) naley rozumie: zainicjalizuj skadow N wartoci NN.

Jak wida z powyszego przykadu, w licie inicjalizacyjnej moemy umieci nie tylko skadowe stae danej klasy. W szczególnoci moemy umieci tam wszystkie skadowe, które dadz si zainicjowa. Jednak skadowych staych nie mona zainicjowa inaczej - tylko za pomoc listy inicjalizacyjnej.

List inicjalizacyjn stosujemy równie wówczas, gdy komponentem klasy jest obiekt innej klasy - w licie inicjalizacyjnej umieszczamy wywoanie konstruktora tego obiektu. Równie przy dziedziczeniu mamy do czynienia z t list. Wrócimy jeszcze do tych tematów.

2.6.5. Konstruktor kopiujcy.

Kopiowanie obiektu odbywa si w nastpujcych sytuacjach:

1. W programie, w instrukcji przypisania x=y.

2. Przy deklaracji obiektów np. dla klasy kot:

kot pers, angora=pers;

3. Przy wywoywaniu funkcji, której parametrami s obiekty danej klasy przekazywane przez warto.

4. Przy zwracaniu przez funkcj obiektów danej klasy przez warto (tu powstaje chwilowa kopia obiektu wewntrznego).

W sytuacji 1 kopiowanie odbywa si za pomoc operatora przypisania. W sytuacjach 2-4 za pomoc konstruktora kopiujcego.

Jeli nie zrobimy nic, konstruktor posuy si standardowym operatorem przypisania i standardowym konstruktorem kopiujcym. Urzdzenia te przepisz nasze obiekty "komponent po komponencie". Jest to tak zwana "pytka kopia". Jeli pewne komponenty klasy s wskanikami, z przydzielonymi obszarami pamici, wskaniki w takiej kopii bd wskazyway na ten sam obszar pamici wskaniki w oryginale. Doprowadzi to do kopotów przy kasowaniu obiektów - moe nastpi próba wielokrotnego kasowania tego samego obszaru pamici, co koczy si na ogó zawieszeniem programu.

Dlatego w takich przypadkach lepiej przeadowa operator przypisania i napisa wasny konstruktor kopiujcy.

Konstruktor kopiujcy ma form

klasa::klasa(klasa &);

Oto przykad wykorzystania konstruktora kopiujcego

// Program KONSTR1. Demonstracja konstruktora kopiujacego.

#include <iostream.h>

class wiersz

{

int *wsk, dlug;

public:

wiersz(int = 3);

wiersz (wiersz &); // konstruktor kopiujacy

~wiersz() {delete wsk;}

void drukwiersz(char *);

};

wiersz::wiersz(int n)

{

wsk = new int[n];

dlug = n;

for(int i=0; i<n; i++) wsk[i] = 10*i;

}

wiersz::wiersz(wiersz &oryg)

{

dlug=oryg.dlug;

wsk=new int[dlug];

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

wsk[i]=oryg.wsk[i];

}

void wiersz::drukwiersz(char *nap)

{

cout << nap;

for(int i=0; i<dlug; i++)cout << wsk[i] << ' ';

cout << endl;

}

void trzywiersze()

{

wiersz r, s(5),z=r;

r.drukwiersz("r: ");

s.drukwiersz("s: ");

z.drukwiersz("z: ");

}

main()

{trzywiersze();}

Konstruktor kopiujcy skopiowa zarówno skadowe oryginalnego obiektu, jak i wykorzystany bufor.



Wyszukiwarka

Podobne podstrony:
Programowanie obiektowe(ćw) 1
Zadanie projekt przychodnia lekarska, Programowanie obiektowe
Programowanie obiektowe w PHP4 i PHP5 11 2005
Programowanie Obiektowe ZadTest Nieznany
Egzamin Programowanie Obiektowe Głowacki, Programowanie Obiektowe
Jezyk C Efektywne programowanie obiektowe cpefpo
Programowanie Obiektowe Ćwiczenia 5
Programowanie obiektowe(cw) 2 i Nieznany
programowanie obiektowe 05, c c++, c#
Intuicyjne podstawy programowania obiektowego0
Programowanie obiektowe, CPP program, 1
wyklad5.cpp, JAVA jest językiem programowania obiektowego
projekt01, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
przeciazanie metod i operatorow, Programowanie obiektowe
projekt06, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
projekt07, wisisz, wydzial informatyki, studia zaoczne inzynierskie, programowanie obiektowe, projek
Programowanie Obiektowe Cz2, Dziedziczenie proste
Programowanie obiektowe, w2, 2

więcej podobnych podstron