Konstruktor - czym jest?

0

Mógłby mi ktoś łopatologicznie wytłumaczyć, jak małemu dziecku, do czego służy konstruktor w klasach? Męczę się z tym od trzech dni i nie potrafię tego pojąć :(

Rozumiem czym jest struktura. Przydaje się na przykład, kiedy chcemy wprowadzić kilka jakichś punktów, które mają zdefiniowane x, y i swoją nazwę, tak?
Klasa, to w zasadzie to samo, tyle że w klasie domyślnie wszystko jest ustawione na prywatne, a do tego w klasie możemy pisać funkcje (metody). Tak?

Nie rozumiem tylko czemu służy ten konstruktor. Po co on jest? Do czego się przydaje? Czytam o tym w różnych kursach i nadal nie rozumiem :(

1

Konstruktor to funkcja (metoda), której uruchomienie jest wymuszane na deweloperze (przez kompilator) podczas tworzenia obiektu.
Generalnie chodzi o to by nie tworzyć obiektów, na których wywołanie innych metod przypniecie nieprzewidziany skutek.
Celem konstruktora jest takie zainicjalizowanie pól obiektu, by reprezentowały one jakiś sensowny stan obiektu.

1

Klasa to struktura, której domyślny dostęp do członków jest prywatny. Nie ma żadnej innej różnicy¹.

Konstruktor pozwala w wygodny sposób zainicjalizować obiekt. Jest to prawie zupełny odpowiednik funkcji podobnych do init_struct_foo(foo*) z C (ale w C++ konstruktor jest np. jedynym możliwym sposobem zainicjalizowania klasy nadrzędnej lub członków będących referencjami).

¹ MSVC inaczej mangluje klasy i struktury, ale to detal.

1

W strukturze też można mieć metody. Jedyna różnica w C++ między class a struct to domyślny poziom dostępu (public dla struktury, private dla klasy).

Prosty przykład: klasa trzyma tablicę dynamiczną (technicznie rzecz biorąc, trzyma wskaźnik do dynamicznie zaalokowanej pamięci).

struct X
{
    int* tab;
};

Teraz jak tworzysz nowy obiekt tej klasy, to chcesz zaalokować pamięć dla tej tablicy. Dobrym miejscem by to zrobić jest właśnie konstruktor.

struct X
{
    X(int size)
    {
        tab = new int[size];
    }

    X(const X&);  // przy dynamicznej pamięci należy również pamiętać o specjalnym kopiowaniu
    X& operator=(const X&);      // oraz przypisaniu
    ~X();       //nalezy pamietac o sprzataniu po sobie w destruktorze

    int* tab;
};

Konstruktor służy zazwyczaj do inicjalizacji składowych klasy, które wymagają specjalnego traktowania np. alokacji pamięci.

0

PROSTY PRZYKŁAD!

#include <iostream>
using namespace std;

class Klasa{
	private:
	int zmienna; //TO JEST NASZA ZMIENNA PRYWATNA
	
	public:
	Klasa(){ //TO JEST NASZ KONSTRUKTOR
		zmienna = 666;
	}
	
	int getZmienna(){
		return zmienna; //Tutaj zwracamy nasza zmienna prywatną
	}
};

int main() {
	
	Klasa objekt; //tutaj tworzymy nasz objekt ! A nasz konstruktor wywoułuje się przy tworzeniu obiektu! :)
	cout<< objekt.getZmienna(); //Zobacz! nasza zmienna w objekcie ma wartosc 666!
	return 0;
}

Czyli konstruktor to taka metoda która wywołuje się przy tworzeniu obiektu. Nie trzeba jej wcale wywoływać, on wywoła się sam - jak już mówiłem przy tworzeniu obiektu.

1

Chyba nikt nie zapytał o podstawową rzecz przed tłumaczeniem. Kilka razy już zdarzyło się, że znajomi nie byli w stanie pojąć konstruktorów z tego powodu. Wiesz dokładnie jaka jest różnica między KLASĄ a OBIEKTEM ?

0

Konstruktor to taka funkcja/metoda, która jest wywoływana przy tworzeniu obiektu klasy. Obiekt klasy to konkretny przypadek/instancja owej klasy. Dzięki konstruktorowi jesteśmy w stanie zainicjalizować nasze pola w klasie, wykonać jakieś obliczenia/działania przez które nasz obiekt będzie poprawnie działał.
Załóżmy, że mamy taką klasę:

 
class Example {
	int* dynamic_table;
public:
	Example(size_t table_size) {
		dynamic_table = new int[table_size];
	}

	~Example() {
		delete dynamic_table;
	}
};

Konstruktor przyjmuje wielkość tablicy na jakiej potem będzie operował obiekt(Konkretny przypadek klasy). Nie musimy alokować ręcznie tej tablicy w innym miejscu kodu lub poprzez inną funkcję. Wszystko się robi przy konstrukcji zdala od rąk np. innego programisty, który nie powinien mieć możliwości ingerencji w wewnętrzne zmienne klasy. Pamiętaj również o zwolnieniu dynamicznie zaalokowanej pamięci. Możesz też użyć inteligentnego wskaźnika takiego jak std::unique_ptr<int>, który automatycznie wywoła dealokacje przy destrukcji instancji Example.

1 użytkowników online, w tym zalogowanych: 0, gości: 1