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