[...]
Konstruktor określa sposób tworzenia egzemplarza klasy obiektu. Nie popełniaj powszechnie stosowanego błędu zakładając, że to utworzenia obiektu wystarczy po prostu zadeklarować zmienną, której typem jest klasa obiektu:
- Kod: Zaznacz cały
Aclass = MyObjectInstance; //to nie będzie działać!
To nie będzie działać. Kompilator rzeczywiście wygeneruje błąd: "Klasy w stylu VCL należy budować przy użyciu operatora new", jeśli spróbujesz to zrobić
(zakładają oczywiście, że Twój obiekt pochodzi od klasy TObject). Przyczyna tego jest dość złożona i niezbyt związana z naszą dyskusją. Rzecz w tym, że musisz
zadeklarować wskaźnik do obiektu, tak jak w poniższym przykładzie:
- Kod: Zaznacz cały
Aclass *MyObjectInstance; // to jeszcze nie wystarczy
Nie zrozum mnie źle: musisz to zrobić - jak się przekonasz na podstawie wydruku 8.8 przedstawionego w dalszej części tego rozdziału - ale
zadeklarowanie wskaźnika do zmiennej klasy obiektu nie wystarczy. Obiekty mają swoją specyfikę, której jeszcze nie mogę wyjaśnić, i tworzone są w procesie
dwuetapowym. Najpierw musisz zadeklarować wskaźnik do zmiennej w sposób pokazany wyżej. Następnie musisz
utworzyć ten obiekt za pomocą operatora
new w sposób następujący:
- Kod: Zaznacz cały
MyObjectInstance = new Aclass;
new operuje na obszarze pamięci zwanym stertą, którego szczegółowo nie omówimy w tej książce. Sterta znana jest również po nazwą pamięci dynamicznej i jest tak nazywana, ponieważ kod C++ Buildera potrafi tworzyć i usuwać z niej zmienne. Istnieje jeszcze
pamięć statyczna, w której tworzone są
zwykłe zmienne, ale nie zmienia się ona podczas wykonywania programu i przez cały ten czas zwykłe zmienne zajmują obszar. Natomiast zmienne w pamięci dynamicznej mogą powstawać i znikać, co pozwala na bardziej efektywne wykorzystanie pamięci RAM.
- Obiekty VCL mogą istnieć tylko w pamięci dynamicznej. Operator new układa je na stercie i informuje ukrytą maszynerię C++ Buildera, która zarządza pamięcią dynamiczną, że obiekt istnieje, mówi też w którym miejscu.
[...]
Kiedy operator new umieści obiekt w pamięci, wywołuje jego konstruktora, aby mógł sam siebie
zainicjować - ustawić wartości domyślne, utworzyć inne obiekty, wykonać pewne obliczenia itp.
Konstruktora musimy dostarczyć dla każdej wywodzącej się od TObject klasy, którą tworzymy. A pierwszą rzeczą wykonywaną przez konstruktora - zanim wykona on cokolwiek innego - jest wywołanie konstruktora TObject.
Konstruktor klasy deklaruje się w definicji klasy w sposób następujący:
- Kod: Zaznacz cały
virtual __fastcall NazwaKlasa(<parametry>);
[...]