logo

Konstruktory i destruktory


Klasy posiadają specjalne funkcje składowe, zwane konstruktorami, służące do inicjalizowania składowych obiektów tej klasy. Inicjalizacja łączy utworzenie obiektu w pamięci i nadanie początkowych wartości jego składowych. Konstruktor może w razie potrzeby posiadać parametry, ale nie może zwracać wartości – nawet void. Konstruktor jest metodą klasy o takiej samej nazwie, jak nazwa klasy.

Kiedy zadeklarujesz konstruktor, powinieneś także zadeklarować destruktor. Konstruktor tworzy i inicjalizuje obiekt danej klasy, zaś destruktor porządkuje obiekt i zwalnia pamięć, którą mógł zaalokować obiekt. Destruktor zawsze nosi nazwę klasy, poprzedzoną znakiem tyldy (~). Destruktory nie mają argumentów i nie zwracającą wartości.

Przykład 4. Definicja konstruktora domyślnego i destruktora obiektów klasy Czas


#pragma once


//deklaracja klasy
class Czas
{
	public:

	Czas(){ std::cout << "Konstruktor" << std::endl; }
	~Czas(){ std::cout << "Destruktor" << std::endl; }
	
	void ustawCzas(int g, int m, int s ) 
	{ godz = g; min = m; sek = s; }
	
	void drukujCzas();

	private:
	
	int godz, min, sek;
}; // nigdy nie zapominac o ;

Istnieje wiele rodzajów konstruktorów; niektóre z nich posiadają argumenty, inne nie. Konstruktor, który można wywołać bez żadnych argumentów, jest nazwany konstruktorem domyślnym. Istnieje tylko jeden rodzaj destruktora. On także nie posiada argumentów.

Jeśli nie zdefiniujesz konstruktora lub destruktora, kompilator stworzy je sam. Konstruktor dostarczany przez kompilator jest konstruktorem domyślnym.

Przykład 5. Funkcję main. Wszystko zebrane razem




#include<cstdlib>
#include<iostream>
#include "czas.h"

using namespace std;


int main(int argc, char *argv[])
{
	{
		Czas t;
		t.ustawCzas(12, 32, 0);
		t.drukujCzas();


		//referencja do obiektu t klasy czas;
		Czas & refT = t;
		t.ustawCzas(13, 30, 0);
		refT.drukujCzas();

		//wskaznik do obiektu t
		Czas * wskT = &t;
		wskT->ustawCzas(11, 20, 15);
		t.drukujCzas();

		// Nowy obiekt na ktory wskazuje wskTStart
		Czas * wskTStart = new Czas;
		wskTStart->ustawCzas(10, 15, 0);
		wskTStart->drukujCzas();
		delete wskTStart;
	}
	
	system("pause");
	return 0;
};

logo