Projektowanie i programowanie
Projektowanie i programowanie
obiektowe I
obiektowe I
KONSTRUKTORY I
KONSTRUKTORY I
DESTRUKTORY KLAS
DESTRUKTORY KLAS
Krótkie przypomnienie:
Krótkie przypomnienie:
l Języki obiektowe dostarczają konstrukcji które łączą abstrakcję
proceduralną i abstrakcję danych.
l Pojęciem łączącym oba rodzaje abstrakcji, a dodatkowo
wspierającym ochronę danych jest KLASA.
l Klasa reprezentuje pewne pojęcie z dziedziny rozwiązywanego
problemu, jest nowym typem danych reprezentującym ten
problem (pojęcie, pomysł)
l OBIEKTEM (instancją, przejawem), nazywamy element
należący do pewnej dziedziny (klasy)
l Do poszczególnych składowych klasy możemy mieć różny
dostęp (składowe: publiczne,prywatne, chronione)
Konstruktor i destruktor
Konstruktor i destruktor
Obiekty klasy tworzy się i inicjuje za pomocą
specjalnych funkcji składowych (operacji, metod)
zwanych konstruktorami.
Niszczenie obiektów realizowane jest za pomocą funkcji
składowych zwanych destruktorami.
Konstruktor definicja, zastosowanie
Konstruktor definicja, zastosowanie
Konstruktor to specjalna funkcja składowa, która nazywa się tak
samo jak klasa
Np. class osoba
{
&
osoba() //deklaracja konstruktora
};
W ciele konstruktora możemy zamieścić instrukcje nadające
składnikom obiektu wartości początkowe (inicjalizacja obiektu)
Konstruktor uruchamiany jest automatycznie w trakcie
definiowania obiektu ( po przydzieleniu pamięci na obiekt)
Np. osoba Pracownik; //definicja obiektu Pracownik
Konstruktor sam nie przydziela pamięci na obiekt, on może ją
tylko zainicjalizować. Może natomiast przydzielić pamięć na
konkretne składowe obiektu.
Konstruktor nie ma wyspecyfikowanego typu (konstruktor
niczego nie zwraca)
osoba::osoba ()
{
& //ciało konstruktora
};
int osoba::osoba ()
{
& //ciało konstruktora
return 0;
}
Konstruktor jest zwykle deklarowany jako publiczny
class osoba{
&
public:
osoba();
} ;
Klasa, która nie ma publicznych konstruktorów jest nazywana klasą
prywatną (pojęcia zaprzyjaznienia na pózniejszych wykładach)
Jeśli nie zdefiniujemy w klasie żadnego konstruktora
kompilator generuje automatycznie tzw. konstruktor domyślny
(domniemany, bezparametrowy) który jest pusty. Istnieje
również możliwość własnej definicji konstruktora domyślnego
osoba::osoba()
{ //definicja pustego konstruktora domyślnego
}
Przy pomocy konstruktora domyślnego możemy
zainicjalizować składowe obiektu i przydzielić dla nich
pamięć.
Konstruktor domyślny jest wywoływany w trakcie definicji
obiektu, dla którego nie podajemy żadnych parametrów
(konstruktor bezparametrowy)
Np. osoba Pracownik; //wywołanie konstruktora domyślnego
Istnieje możliwość definicji konstruktora domniemanego
zawierającego tzw. argumenty (parametry) domniemane
class osoba{
&
public:
osoba(char *c = NULL, int w = 0);
};
W klasie możemy zdefiniować tylko jeden konstruktor
domniemany. Nie ma możliwości przeciążenia (przeładowania)
tego konstruktora
Konstruktor zawierający w swojej deklaracji listę argumentów
(parametrów) nazywamy konstruktorem parametrowym
class osoba{
&
osoba(char *nazw, int lata); //deklaracja konstruktora parametrowego
} ;
Przykładowe wywołanie konstruktora parametrowego w momencie
tworzenia obiektu:
osoba Pracownik( Kowalski ,25);
Przykładowe ciało (definicja) konstruktora parametrowego:
osoba::osoba(char *nazw, int lata)
{ strcpy(nazwisko,nazw);
wiek = lata;
}
Składowe obiektu możemy zainicjalizować przy pomocy listy
inicjalizacyjnej konstruktora
class osoba{
&
public:
osoba(char *nazw, int lata);
};
osoba::osoba(char *nazw, int lata): wiek(lata)
{
strcpy(nazwisko,nazw);
}
Lista inicjalizacyjna sluży m.in. do inicjalizowania składowych
stałych (const)
Referencje
Referencje
Referencja - przezwisko obiektu danej klasy
osoba student; //definicja obiektu student
osoba &ref_student = student; //inna nazwa, przezwisko
konkretnej osoby czyli obiektu student
Referencja nie jest kopią obiektu do którego się odnosi. Każda
operacja na referencji tak naprawdę jest wykonywana na
obiekcie, do którego się odnosi.
Referencja musi być jawnie zainicjowana.
Operacje na referencjach są prawie tak samo efektywne, jak na
wskaznikach.
Referencja nie istnieje bez zmiennej, do której się odnosi.
Wyjątki od powyższej reguły:
1. Deklaracja ze specyfikacją: extern oznacza, że referencje
zainicjowano w innym pliku:
extern osoba & vref;
2. Referencja jest składową klasy została zainicjowana
przez konstruktor.
class osoba{
int & ref_zm;
public:
osoba() { ref_zm = 0;}
};
ć Copyright by Wojciech Tarnawski
3. Referencja występuje jako parametr funkcji inicjacja w
momencie wywołania.
void prezentacja(osoba &ktos) //przekazywanie przez referencję
{ cout << Proszę Państwa, oto we własnej osobie: ;
ktos.wypisz(); }
& //dla przypomnienia : void prezentacja(osoba ktos) przekazywanie przez
wartość przy której występuje niejawne wywołanie konstr kopiującego
void main()
{ osoba student = osoba( Kowalski ,25);
prezentacja(student); //obiekt ktos jest inicjowany atrybutami obiektu
student
}
Obiekty przekazywane są przez referencje przy wywołaniu
konstruktora kopiującego
4. Funkcja zwraca referencje inicjacja referencji w momencie
powrotu z funkcji.
osoba & znajdz_osobe(char *nazw)
{ & //szukanie obiektu o określonym nazwisku
return znaleziona_osoba;
}
Niedozwolone operacje na referencjach
1. Wskazywanie na referencje
2. Pobieranie adresu referencji
3. Porównywanie referencji
4. Przypisywanie referencjom wartości (poza inicjowaniem)
5. Wykonywanie na referencji działań arytmetycznych
6. Modyfikowanie wartości referencji
Referencje do stałych obiektów
Zabezpieczenie przed modyfikacja parametru funkcji:
// Ta funkcja nie może zmieniać swojego argumentu
void drukuj( const int & arg ){
cout <
arg = 0; // Bład! (Nie mozna modyfikowac)
}
void main(){
int liczba = 10;
drukuj( liczba );
Wniosek: Jeśli chcemy przy pomocy konstruktora kopiującego
utworzyć kopię obiektu bez zmiany wartości atrybutów obiektu
wzorcowego bezpiecznie jest używać referencji do stałych
obiektów.
Np. osoba::osoba(const osoba & wzorzec)
Destruktor definicja, zastosowanie
Destruktor definicja, zastosowanie
Destruktor funkcja składowa klasy wywoływana wtedy, gdy
obiekt danej klasy ma być zlikwidowany. Służy do sprzątania
po obiekcie (zwalnianie, zerowanie pamięci)
Przykład klasy osoba z destruktorem:
class osoba{
&
public:
~osoba(void) {cout << Pracuje destruktor ;}
};
Destruktor wywoływany jest automatycznie gdy obiekt jest likwidowany
Destruktor nie może zwracać żadnej wartości
Destruktor nie może być wywoływany z żadnymi argumentami
Jawne wywołanie destruktora:
Na zewnątrz klasy (np.. w funkcji main()):
osoba student = osoba( Kowalski ,25);
student.~osoba();
Wewnątrz klasy:
class osoba{
&
public:
usun_sie(void) { this->~osoba();}
};
Wyszukiwarka
Podobne podstrony:
Wyklad3a PPK sem2 PKos ProgObiek Przyklady
Wyklad2c PPK sem2 PKos WstepDoProgramObiektowego
Wyklad1 PPK sem2 PrzegladFunkcjePrzecInne PKos StudForum
Wyklad2a PPK sem2 PKos ProgramowanieZaawansowane?
Wyklad2d PPK sem2 PKos DynamicznaAlokacjaTablic
Wyklad2b PPK sem2 PKos AlgorytmyRozne 1
MC W Wyklad Tlenkowe Materialy Konstrukcyjne
wykład 1 proces projektowania i konstruowania maszyn
BUD OG wykład 9 Fundamenty 3 Rowiazania konstrukcyjne
Konstrukcje zespolone pierwszy wykład
Konstrukcje metalowe Sem[1][1] VI Wyklad 05
konstrukcje metalowe sem vi wyklad
PPK wykład
więcej podobnych podstron