Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podobne dokumenty
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wykład 8: klasy cz. 4

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Zaawansowane programowanie w języku C++ Klasy w C++

Wykład 5: Klasy cz. 3

Materiały do zajęć VII

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Wykład 4: Klasy i Metody

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Języki i techniki programowania Ćwiczenia 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Podstawy Programowania Obiektowego

Programowanie Obiektowe i C++

PARADYGMATY PROGRAMOWANIA Wykład 4

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

PARADYGMATY PROGRAMOWANIA Wykład 2

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktor kopiujacy

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wstęp do Programowania 2

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

PARADYGMATY PROGRAMOWANIA Wykład 3

Dokumentacja do API Javy.

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Definiowanie własnych klas

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Wstęp do programowania obiektowego. Wykład 2

Szablony klas, zastosowanie szablonów w programach

Enkapsulacja, dziedziczenie, polimorfizm

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Definicje klas i obiektów. Tomasz Borzyszkowski

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie obiektowe

Programowanie obiektowe i C++ dla matematyków

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 12

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Technologie i usługi internetowe cz. 2

Programowanie 2. Język C++. Wykład 3.

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie obiektowe

Programowanie, część I

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

TEMAT : KLASY DZIEDZICZENIE

Wprowadzenie do programowanie obiektowego w języku C++

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Programowanie obiektowe - 1.

Język C++ zajęcia nr 2

Referencje do zmiennych i obiektów

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Kurs WWW. Paweł Rajba.

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Język C++ Różnice między C a C++

Podstawy programowania obiektowego

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie obiektowe w C++ Wykład 03 Temat wiodący: Konstruktory i deskruktory. Konstruktory i Destruktory

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Zaawansowane programowanie w C++ (PCP)

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Aplikacje w środowisku Java

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Dziedziczenie jednobazowe, poliformizm

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Do czego służą klasy?

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Programowanie i struktury danych

Zaawansowane programowanie w C++ (PCP)

Deklaracja struktury w C++

Transkrypt:

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B

Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja konstruktor destruktor operator przypisania konstruktor kopiujący Na podstawie: A. Allain, Przewodnik dla początkujących C++ S. Prata, Szkoła programowania C++

Unikanie powtórzeń W celu uniknięcia powtórzeń fragmentów kodu wygodnie jest wydzielać funkcje implementujące algorytm lub jego fragment okrag(10, 10, 5) wypelnijokrag(10, 10, CZERWONY) rysujpocisk(10,10)

Unikanie powtórzeń Powtórzenia mogą dotyczyć nie tylko algorytmów, ale także struktur danych. enum BierkaSzachowa = {PUSTE_POLE, BIALY_PION, BIALA_WIEZA, /*i pozostałe bierki*/; //...mnóstwo kodu for(int i = 0; i < 8; i++) szachownica[i][1] = BIALY_PION;

Unikanie powtórzeń Powtórzenia mogą dotyczyć nie tylko algorytmów, ale także struktur danych. //...mnóstwo kodu if( szachownica[0][0] == BIALY_PION ){ /* zrób coś */

Abstrakcja funkcyjna Szczegóły związane ze strukturą danych można ukryć, wykorzystując abstrakcję funkcyjną. BierkaSzachowa pobierzbierke(int x, int y){ return szachownica[x][y];

Abstrakcja funkcyjna Funkcja określa, jakie dane wejściowe pobiera oraz jakie dane wyjściowe zwraca, ale nic nie mówi o tym jak jest implementowana. BierkaSzachowa pobierzbierke(int x, int y){ return szachownica[x][y];

Abstrakcja funkcyjna Zalety stosowania abstrakcji funkcyjnej: nie musisz pamiętać implementacji, możesz korzystać z gotowej funkcji, jeśli odnajdziesz błąd w implementacji, to wystarczy go naprawić w jednym miejscu, zapewniasz sobie elastyczność w implementacji możesz zacząć od sposobu łatwiejszego w implementacji, ale być może mniej efektywnego, a później zastąpić go wydajniejszym.

Ukrywanie reprezentacji struktur danych Nie jest ważne, jak przechowujesz dane, ale co z nimi robisz Przykład klasa string odczytywanie długości łańcucha, odczytywanie i zapis znaków, wyświetlanie na ekran, nie jest istotne jak są przechowywane dane (np. tablice znakowe, listy powiązane).

Użycie funkcji w celu ukrycia układu struktury enum BierkaSzachowa = {PUSTE_POLE, BIALY_PION, BIALA_WIEZA, /*i pozostałe bierki*/; enum KolorGracza = {KG_BIALY, KG_CZARNY; struct Szachownica{ BierkaSzachowa plansza[8][8]; KolorGracza czyj_ruch;

Użycie funkcji w celu ukrycia układu struktury BierkaSzachowa pobierzbierke( const Szachownica* w_plansza, int x, int y ){ return w_plansza->plansza[x][y]; KolorGracza pobierzruch(const Szachownica* w_plansza){ return w_plansza->czyj_ruch;

Użycie funkcji w celu ukrycia układu struktury void wykonajruch( Szachownica* w_plansza, int z_x, int z_y, int na_x, int na_y ){ //tu sprawdzilibyśmy dopuszczalność ruchu w_plansza->plansza[na_x][na_y] = \ w_plansza->plansza[z_x][z_y]; w_plansza->plansza[z_x][z_y] = \ PUSTE_POLE;

Użycie funkcji w celu ukrycia układu struktury Szachownica b; //inicjalizacja szachownicy pobierzruch(&b); wykonajruch(&b, 0, 0, 1, 0); //przesuń bierkę z (0, 0) na (1, 0) Funkcje są połączone ze strukturą, ponieważ pobierają ją jako argument.

Funkcja jako składowa struktury Metoda jest funkcją zadeklarowaną jako część struktury Wywołanie metody nastąpi dla instancji struktury

Funkcja jako składowa struktury struct Szachownica{ BierkaSzachowa plansza[8][8]; KolorGracza czyj_ruch; BierkaSzachowa pobierzbierke( int x, int y ){ return plansza[x][y]; KolorGracza pobierzruch(){ return czyj_ruch; void wykonajruch(int z_x, int z_y, int na_x, int na_y ){ //tu sprawdzilibyśmy dopuszczalność ruchu plansza[na_x][na_y] = plansza[z_x][z_y]; plansza[z_x][z_y] = PUSTE_POLE;

Funkcja jako składowa struktury Szachownica b; //inicjalizacja szachownicy b.pobierzruch(); b.wykonajruch(0, 0, 1, 0); //przesuń bierkę z (0, 0) na (1, 0) Wywołanie metody wygląda niemal jak odwołanie się do pola struktury.

Zewnętrzna definicja metody struct Szachownica{ BierkaSzachowa plansza[8][8]; KolorGracza czyj_ruch; BierkaSzachowa pobierzbierke( int x, int y ); KolorGracza pobierzruch(); void wykonajruch(int z_x, int z_y, int na_x, int na_y );

Zewnętrzna definicja metody BierkaSzachowa Szachownica::pobierzBierke( int x, int y ){ return plansza[x][y]; KolorGracza Szachownica::pobierzRuch(){ return czyj_ruch; void Szachownica::wykonajRuch( \ int z_x, int z_y, int na_x, int na_y ){ //tu sprawdzilibyśmy dopuszczalność ruchu plansza[na_x][na_y] = plansza[z_x][z_y]; plansza[z_x][z_y] = PUSTE_POLE;

Klasa Klasa przypomina strukturę, ale jest wzbogacona o możliwość określenia, które metody i dane należą do wewnętrznej implementacji klasy, a które są przeznaczone dla jej użytkowników.

Klasa W języku C++ można zabronić metodom, które nie należą do danej klasy, korzystania z wewnętrznych danych klasy. Ułatwia to pielęgnację oprogramowania można modyfikować wewnętrzną implementację klasy bez zmiany kodu korzystającego z tej klasy. Dostęp do składowych klasy może być prywatny (private) lub publiczny (public).

Klasa class Szachownica{ public: BierkaSzachowa pobierzbierke( int x, int y ); KolorGracza pobierzruch(); void wykonajruch(int z_x, int z_y, int na_x, int na_y ); private: BierkaSzachowa _plansza[8][8]; KolorGracza _czyj_ruch; ;

Klasa BierkaSzachowa Szachownica::pobierzBierke( int x, int y ){ return _plansza[x][y]; KolorGracza Szachownica::pobierzRuch(){ return _czyj_ruch; void Szachownica::wykonajRuch( \ int z_x, int z_y, int na_x, int na_y ){ //tu sprawdzilibyśmy dopuszczalność ruchu _plansza[na_x][na_y] = _plansza[z_x][z_y]; _plansza[z_x][z_y] = PUSTE_POLE;

Klasa Szachownica b; //inicjalizacja szachownicy b.pobierzruch(); b.wykonajruch(0, 0, 1, 0); //przesuń bierkę z (0, 0) na (1, 0) Zmienną określonej klasy nazywamy obiektem.

Klasa Tworzenie klasy to tworzenie nowego typu danych. W pierwszej kolejności określ, co klasa powinna robić określ interfejs. Następnie określ jakich składowych (pól i metod) będziesz potrzebować. Wszystkie metody, które nie muszą być publiczne powinny być prywatne. Zalecenie: nie definiuj pól klasy jako publicznych. Jeśli potrzebujesz udostępnić określone pole, stwórz metody, które je udostępniają (setter i getter).

Klasa Pola prywatne są przechowywane w pamięci tak samo jak pola publiczne, zwykle tuż obok. Pola prywatne nie gwarantują bezpieczeństwa prywatnych danych w przypadku działania złośliwego programu.

Hermetyzacja Hermetyzacja (enkapsulacja) oznacza ukrywanie implementacji, dzięki czemu użytkownicy klasy mogą pracować wyłącznie z określonym zbiorem metod, które stanowią interfejs klasy.

Cykl życia klasy Istnieją trzy operacje, które (najprawdopodobniej) będzie realizować każda klasa: inicjalizacja, czyszczenie pamięci (lub innych zasobów), kopiowanie samej siebie.

Konstruktor Szachownica plansza; Konstruktor pozwala na zainicjalizowanie pól obiektu w momencie deklaracji.

Konstruktor class Szachownica{ public: Szachownica(); //konstruktor brak zwracanej wartości BierkaSzachowa pobierzbierke( int x, int y ); KolorGracza pobierzruch(); void wykonajruch(int z_x, int z_y, int na_x, int na_y ); private: BierkaSzachowa _plansza[8][8]; KolorGracza _czyj_ruch; ;

Konstruktor Szachownica::Szachownica(){ _czyj_ruch = KG_BIALY; //czyścimy planszę for(int i=0; i<8; i++){ for(int j=0; j<8; j++){ _plansza[i][j] = PUSTE_POLE; ; //pozostały kod ustawiający bierki

Konstruktor Konstruktor jest wywoływany przy deklaracji obiektu Szachownica plansza; Jest także wywoływany podczas alokowania pamięci Szachownica *plansza = new Szachownica; Jeśli deklarujesz wiele obiektów, to konstruktory wywoływane są w kolejności deklaracji. Szachownica a; Szachownica b;

Konstruktor Konstruktory mogą przyjmować argumenty, można je także przeciążać. class Szachownica{ public: Szachownica(); Szachownica(int rozmiar_planszy); //pozostałe składowe klasy ; Szachownica plansza(8); //8 jest argumentem konstruktora Szachownica *plansza = new Szachownica(8);

Konstruktor //tak nie można Szachownica plansza(); //ale to zadziała Szachownica *plansza = new Szachownica();

Konstruktor domyślny Jeśli nie utworzysz konstruktora, zostanie stworzony konstruktor domyślny. Konstruktor domyślny inicjalizuje wszystkie pola klasy wywołując ich konstruktory (zmienne podstawowe nie zostaną zainicjalizowane).

Konstruktor domyślny Jeśli zadeklarujesz (jakikolwiek) konstruktor, nie będzie tworzony konstruktor domyślny.

Inicjalizacja składowych klasy class Szachownica{ public: Szachownica(); string pobierzruch(); BierkaSzachowa pobierzbierke( int x, int y ); void wykonajruch(int z_x, int z_y, int na_x, int na_y ); private: BierkaSzachowa _plansza[8][8]; string _czyj_ruch; ;

Inicjalizacja składowych klasy Konstruktor Szachownica::Szachownica(){ _czyj_ruch = "bialy"; //dalszy kod Konstruktor z listą inicjalizacyjną Szachownica::Szachownica() : _czyj_ruch("bialy"){ //dalszy kod

Inicjalizacja składowych klasy class Szachownica{ public: Szachownica(); string pobierzruch(); BierkaSzachowa pobierzbierke( int x, int y ); void wykonajruch(int z_x, int z_y, int na_x, int na_y ); private: BierkaSzachowa _plansza[8][8]; string _czyj_ruch; int _licznik_ruchow; ;

Inicjalizacja składowych klasy Konstruktor z listą inicjalizacyjną Szachownica::Szachownica() : _czyj_ruch("bialy"), _licznik_ruchow( 0 ){ //dalszy kod

Inicjalizacja składowych klasy Jeśli pole klasy jest zadeklarowane jako stałe, to musi zostać umieszczone na liście inicjalizacyjnej class ListaStalych{ public: ListaStalych(int wart); ; private: const int _wart; ListaStalych::ListaStalych(int wart) : _wart(wart){

Inicjalizacja składowych klasy Podobnie pole, które jest referencją musi być inicjalizowane na liście

Niszczenie obiektu Jeśli konstruktor alokuje pamięć, to zwolnienie jej powinno nastąpić w destruktorze.

Niszczenie obiektu struct WezelListyPowiazanej{ int wart; WezelListyPowiazanej *w_następny; ; class ListaPowiazana{ public: ListaPowiazana(); //konstruktor void wstaw(int wart); //dodanie węzła ; private: WezelListyPowiazanej *_w_glowa;

Niszczenie obiektu class ListaPowiazana{ public: ListaPowiazana(); //konstruktor ~ListaPowiazana(); //destruktor void wstaw(int wart); //dodanie węzła ; private: WezelListyPowiazanej *_w_glowa;

Niszczenie obiektu ListaPowiazana::~ListaPowiazana(){ WezelListyPowiazanej *w_itr = _w_glowa; while( w_itr!= NULL ) { WezelListyPowiazanej *w_tymcz = w_itr->w_następny; delete w_itr; w_itr = w_tymcz;

Niszczenie obiektu class WezelListyPowiazanej{ public: ~WezelListyPowiazanej(); int wart; WezelListyPowiazanej *w_nastepny; ; WezelListyPowiazanej::~WezelListyPowiazanej(){ delete w_nastepny; ListaPowiazana::~ListaPowiazana(){ delete _w_glowa;

Niszczenie obiektu Destruktor jest wywoływany gdy: usunięto wskaźnik do tego obiektu, obiekt wyszedł poza zasięg, obiekt należy do klasy, której destruktor wywołano.

Niszczenie obiektu ListaPowiazana *w_lista = new ListaPowiazana; delete w_lista;

Niszczenie obiektu if(1){ ListaPowiazana lista; //tu jest wywołany destruktor { ListaPowiazana a; ListaPowiazana b; //tu są wywołane destruktory //najpierw niszczony jest obiekt b //później a

Niszczenie obiektu class NazwaOrazEmail{ //metody klasy private: string _nazwa; string _email; ;

Kopiowanie obiektów ListaPowiazana lista_jeden; ListaPowiazana lista_dwa; lista_dwa = lista_jeden; ListaPowiazana lista_trzy = lista_dwa;

Kopiowanie obiektów Istnieje domyślny operator przypisania Wykorzystanie domyślnego operatora przypisania może prowadzić do powstania płytkiej kopii lista_dwa = lista_jeden; //lista_dwa._w_glowa = lista_jeden._w_glowa;

Kopiowanie obiektów lista_dwa = lista_jeden; Implementacja operatora przypisania ListaPowiazana& operator= (ListaPowiazana& lewa, const ListaPowiazana& prawa);

Kopiowanie obiektów Implementacja operatora przypisania wewnątrz klasy class ListaPowiazana{ public: ListaPowiazana(); //konstruktor ~ListaPowiazana(); //destruktor ListaPowiazana& operator= (const ListaPowiazana& inna); void wstaw(int wart); //dodanie węzła ; private: WezelListyPowiazanej *_w_glowa;

Kopiowanie obiektów ListaPowiazana& ListaPowiazana::operator= (const ListaPowiazana& inna) { if(this == &inna){ return *this; delete _w_glowa; _w_glowa = NULL; ; WezelListyPowiazanej *w_itr = inna._w_glowa; while (w_itr!= NULL){ wstaw( w_itr->wart ); w_itr = w_itr->w_następny; return *this;

Konstruktor kopiujący ListaPowiazana lista_jeden; ListaPowiazana lista_dwa(lista_jeden);

Kopiowanie obiektów Implementacja operatora przypisania wewnątrz klasy class ListaPowiazana{ public: ListaPowiazana(); //konstruktor ~ListaPowiazana(); //destruktor ListaPowiazana& operator= (const ListaPowiazana& inna); ListaPowiazana (const ListaPowiazana& inna); void wstaw(int wart); //dodanie węzła ; private: WezelListyPowiazanej *_w_glowa;

Kopiowanie obiektów ListaPowiazana::ListaPowiazana (const ListaPowiazana& inna) : _w_glowa(null) { WezelListyPowiazanej *w_itr = inna._w_glowa; while (w_itr!= NULL) { wstaw( w_itr->wart ); w_itr = w_itr->w_następny; ;

Metody generowane automatycznie 1. Domyślny konstruktor 2. Domyślny destruktor 3. Operator przypisania 4. Konstruktor kopiujący

Podsumowanie Abstrakcja funkcyjna Struktury Klasy hermetyzacja konstruktor destruktor operator przypisania konstruktor kopiujący