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:około godziny
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:dzień
  • 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)