lab 09
Transkrypt
lab 09
Laboratorium nr 9 Temat: Deklaracja konstruktorów i destruktorów. Dynamiczna alokacja pamięci. 1) Konstruktory Zadaniem konstruktorów jest inicjowanie obiektów. Konstruktory są funkcjami składowymi, które wywoływane są automatycznie podczas tworzenia obiektu. Nazwa funkcje konstruktora odpowiada nazwie klasy. Funkcja konstruktora musi być funkcją publiczną (public) i nie powinna zwracać żadnej wartości, np. klasa::klasa() {...} C++ posiada możliwość przesłania parametrów do konstruktora obiektu, co rozwiązuje większość problemów na jakie można się natknąć podczas inicjowania obiektu, np. klasa::klasa(int x) {...} ... class klasa obiekt( wartość typu int); 2) Destruktory Podobnie jak konstruktory, destruktory są wywoływane automatycznie w momencie zakończenia wykonywania operacji na obiekcie/usuwania obiektu. Destruktory mogą np. zwalniać obszar pamięci, który został przydzielony obiektowi. Destruktor definiuje się w ten sam sposób jak konstruktor, przy czym do jego nazwy dodaje się jedynie znak ~, np. klasa::~klasa() {...} Uwagi: • W przypadku C++ wszystkie wewnętrzne szczegóły związane z konstruktorem i destruktorem są obsługiwane przez sam obiekt. • Korzystając z „Menadżera Zadań” w systemie Windows lub z „Monitora Systemu” w systemie Linux można obserwować alokacje oraz zwalnianie pamięci w trakcie działania programu => wymagane duże tablice !!! (> 1 000 000) #include <iostream> using namespace std; int main() { int wybor=0, rozmiar=0, *tablica=NULL; do { cout << "1. utworz\t" << "2. kasuj\t" << "3. koniec\n"; cin >> wybor; switch (wybor) { case 1: cout << "Rozmiar tablicy="; cin >> rozmiar; tablica=new int[rozmiar]; for (long int i=0;i<rozmiar;i++) *(tablica+i)=i; break; case 2: delete tablica; cout << "Usunieto tablice\n"; break; case 3: cout << "Koniec\n"; break; }; } while (wybor!=3); return 0; } • Interpretacja wybranych deklaracji wskaźników: Deklaracja Interpretacja int i; zmienna całkowita (typu int) 'i' int *p; wskaźnik 'p' wskazujący na zmienną całkowitą int a[]; tablica 'a' liczb całkowitych typu int int **pp; wskaźnik 'pp' na wskaźnik wskazujący na liczbę całkowitą typu int int (*pa)[]; wskaźnik 'pa' wskazujący na tablicę liczb całkowitych typu int int *ap[]; tablica 'ap' wskaźników na liczby całkowite typu int int ***ppp; wskaźnik 'ppp' wskazujący na wskaźnik wskazujący na wskaźnik wskazujący na liczbę typu int int (**ppa)[]; wskaźnik 'ppa' na wskaźnik wskazujący na tablicę liczb całkowitych typu int int *(*pap)[]; wskaźnik 'pap' wskazujący na tablicę wskaźników na typ int int **app[]; tablica wskaźników 'app' wskazujących na typ int int (*apa[])[]; tablica wskaźników 'apa' wskazujących wskaźniki na typ int main.cpp #include "klasa.h" int main() { class baza **osoby=NULL; int i; osoby=new baza *[3]; for(i=0;i<3;i++) osoby[i]=new baza("Adam","Nowak","1"); for(i=0;i<3;i++) delete osoby[i]; delete [] osoby; return 0; } klasa.h #include <iostream> #include <string.h> using namespace std; class baza { private: char imie[10]; char nazwisko[25]; char telefon[10]; public: baza(char *i, char *n, char *t); ~baza(); }; klasa.cpp #include "klasa.h" baza::baza(char *i, char *n, char *t){ cout<<"Wprowadzam:\n"; strcpy(this->imie,i); strcpy(this->nazwisko,n); strcpy(this->telefon,t); cout<<"\tImie: "<<this->imie<<"\n"; cout<<"\tNaz.: "<<this->nazwisko<<"\n"; cout<<"\tTel.: "<<this->telefon<< "\n"; }; baza::~baza(){ cout << "Usuwam:\n"; cout<<"\tImie: "<<this->imie<<"\n"; cout<<"\tNaz.: "<<this->nazwisko<<"\n"; cout<<"\tTel.: "<<this->telefon<< "\n"; }; 3) Zadanie: Zmodyfikuj program bazy danych z poprzedniego ćwiczenia tak, aby obsługiwał kilka baz danych o różnej wielkości – jednocześnie przechowywane w pamięci. Program powinien pozwalać na wczytanie bazy do pamięci oraz usunięcie bazy z pamięci. Przykładowe menu: 1. Pobierz/wprowadz dane 2. Usuń dane z pamięci 3. Wyświetl dane 4. Koniec