Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Konstruktory i destruktory ostatni przykad na stronie

Ostatnio zmodyfikowano 2013-10-11 22:44
Autor Wiadomość
tookie009
Temat założony przez niniejszego użytkownika
Konstruktory i destruktory ostatni przykad na stronie
» 2013-10-10 13:16:36
Witam, wanie ucze sie objektowosci.
Stanalem przy lekcji 4 :))

Jest tam taki przykladzik:

C/C++
#include <iostream>

class Test
{
public:
    Test()
    {
        std::cout << "Konstruktor" << std::endl;
    }
    Test( const Test & )
    {
        std::cout << "Konstruktor kopiujacy" << std::endl;
    }
    ~Test()
    {
        std::cout << "Destruktor" << std::endl;
    }
};

int main()
{
    {
        Test t;
    }
    std::cout << "---" << std::endl;
    {
        Test t1;
        Test t2 = t1;
    }
}


Za zadne skarby nie moge zrozumiec :) skopiowalem sobie do swojego komplikatora, i odkrylem, ze znaczenie maja {}.
Do teraz rozumiealem to po prostu tak, ze tworzymy w funkcji main nowe obiekty klasy Test. Nie wywolujemy zadnych metod ani nic, wiec wyszedlem z zalozenia, ze nie powinienem nic dostawac na ekranie. Ale cos zle zrozumialem. Moglby mi ktos to lepiej wytlumaczyc ? Z gory dzieki
P-93466
pekfos
» 2013-10-10 13:34:39
tworzymy w funkcji main nowe obiekty klasy Test.
Konstruktor jest automatycznie wywoływany podczas tworzenia obiektu.
Itd..

komplikatora
Kompilatora.
P-93469
Matej
» 2013-10-10 19:25:46
Prócz tego co napisał pekfos.

Proponuję poczytać czym jest sterta i stos oraz nauczyć się debugować, pozwala to zrozumieć co się dzieje ze zmiennymi w pamięci.

Poćwicz też ze wskaźnikami.

C/C++
int main()
{
    {
        Test * t = new Test();
        delete t;
    }
    std::cout << "---" << std::endl;
    {
        Test * t1 = new Test();
        Test * t2 = new Test( * t1 );
        delete t1;
        delete t2;
    }
}
P-93490
b00rt00s
» 2013-10-11 19:47:29
Konstruktor jest zawsze wywoływany przy tworzeniu obiektu, a destruktor jest zawsze wykonywany przy jego niszczeniu. W przypadku obiektów zaalokowanych na stosie, zniszczenie nastąpi przy wyjściu z zakresu. Wstawienie znaku { oznacza wejście do zakresu, a wstawienie znaku } wyjście z zakresu. Przyglądnij się gdzie w podanym przykładzie występują zakresy, to zrozumiesz co się dzieje.

Zakresy nie mają natomiast znaczenia gdy zmienne tworzone są na stercie, czyli z wykorzystaniem słowa kluczowego new. Takie zmienne musisz zniszczyć samodzielnie używając słowa kluczowego delete. Jeśli tego nie zrobisz, to pamięć nigdy nie zostanie zwolniona i będziesz miał do czynienia z tzw. wyciekiem pamięci.
P-93522
tookie009
Temat założony przez niniejszego użytkownika
» 2013-10-11 22:44:23
Itd..

komplikatora
Kompilatora.
 
Teraz sam się śmieję :))). Dziękuję za rady, w międzyczasie rozkminiałem to wszystko i zrobiło mi się DUŻO jaśniej. Odnośnie sterty i stosu czytałem dawno dawno temu i mniej więcej kojarzę. Debuggera faktycznie muszę się pouczyć. Mam nadzieję, że wygoogleje coś po polsku. Dostałem duży projekt i muszę zrozumieć, jak on działa. Projekt z biblioteką TThread, co na chwilę obecną stanowi dla mnie całkowitą magię. Przestawię moje najbliższe kroki nauki: doczytanie o dziedziczeniu, funkcjach wirtualnych oraz zrozumienie idei listy jednokierunkowej, która w projekcie, którego chcę pojąć wystpępuje parokrotnie. Jeszcze raz dziękuje za pomoc.
P-93530
« 1 »
  Strona 1 z 1