Konstruktor - czym jest?

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 :(

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Fi3rce
To żeś mu wytłumaczył :D
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
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.


twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
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).

Kopiuj
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.

Kopiuj
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.

edytowany 1x, ostatnio: twonek
Zobacz pozostałe 2 komentarze
RA
wy to trolle jesteście :D ciekawe czy wam też tak to tłumaczono :D
twonek
dla mnie większym trollowaniem jest dawanie kodu w Javie początkującemu, który się uczy C++
RA
ja pomyliłem działy, ty tłumaczysz mu na wskaźnikach- jedno z najtrudniejszych zagadnień dla newbie- albo trolling albo głupota
twonek
@rafallvlup Tak jak się przyznałem @kq przykład nie jest najlepszy. Ale po zwróceniu uwagi przynajmniej poprawiłem go tak, by był poprawny. Ty natomiast, nie wiem czy z lenistwa czy po prostu nie umiesz tego zrobić, zostawiasz kod w niepoprawnej Javie (co to jest string) z durnym komentarzem, by początkujący sobie tłumaczył kod z innego języka.
RA
mój post miał tylko małą literówkę, a poza tym posiada inne informacje, których nikt tu nie podał. Będąc początkującym, nawet pod uwagę bym nie brał twoich ślaczków(on nawet nie wie co to wskaźnik ani struktura). a konstruktory w c++ czy javie działają na tej samej zasadzie, tylko zapis jest inny. Prosił o wytłumaczenie jak działają konstruktory, a nie o poprawny kod. Równie dobrze mógłbym napisać to w pseudokodzie.
Heheczek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:148
0

PROSTY PRZYKŁAD!

Kopiuj
#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.

edytowany 1x, ostatnio: Heheczek
Lukasz_
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:140
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ę:

Kopiuj
 
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.

ML
Omg... Zapomniałem się zalogować :(
twonek
masz identyczny przykład jak ja, z tym samym problemem, którym wspomniał @kq
ML
Oj tam, przecież nie będę zmieniał na double* dynamic_table zamiast int. Moim celem było troszeczkę inaczej wytłumaczyć, może w bardziej prosty sposób. Wybacz.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.