eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingCo może robić konstruktor i dlaczego nie?Re: Co może robić konstruktor i dlaczego nie?
  • Data: 2012-07-04 22:34:35
    Temat: Re: Co może robić konstruktor i dlaczego nie?
    Od: "slawek" <h...@s...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Użytkownik "Jordan Szubert" napisał w wiadomości grup
    dyskusyjnych:o...@a...home...

    >nie widzę, jaka właściwość jakiego języka wymuszałaby taki zapis,

    Mniejsza o zapis, rzecz jest nie w notacji, lecz w fakcie iż obiekt jest
    konstruowany przez konstruktor, czyli dopiero po wykonaniu konstruktora
    obiekt jest... skonstruowany. De facto C++ wywołuje wszystkie konstruktory
    podobiektów oraz rodziców zanim wejdzie do body "naszego konstruktora" (więc
    nasz obiekt ma wszystko co trzeba)...

    ale - konstruktor może się sam-z-siebie wywołać (np. jakiś obiekt tymczasowy
    się przypląta). I to jest problem, przynajmniej w C++. Ale czy są jakieś
    języki wolne od tego?

    >podejrzewam inny powód:
    >obiekt foo ma sporo właściwości, które mają rozsądne wartości domyślne

    Nie podejrzewaj. Klasa Foo jest zupełnie przykładowa, cudów w niej nie ma.
    Po prostu rozpisałem sobie coś na klasy i... w każdej - chyba jednak -
    powinien być run(), co doprowadza mnie do zdziwienia "czy to naprawdę
    potrzebne, czy nie wystarczy sam konstruktor?" No bo i po co metoda run -
    skoro klasa jak tylko się utworzy ma robić run - aż do destrukcji?

    >ustawiane w konstruktorze, ale pomiedzy konstrukcją a foo.run() masz
    >możliwość skonfigurowania Sobie obiektu, jeśli jest to taki rzadki
    >wypadek, gdy domyślne ustawienia są nieoptymalne...

    Różnica pomiędzy czymś takim (C++)

    int main() { Foo foo = new Foo; delete foo; return 0; }

    a czymś takim

    int main() { Foo foo = new Foo; foo.run(); delete foo; return 0; }

    Pierwszy zapis jest po prostu krótszy. Ponadto running czegoś jest po prostu
    1:1 z istnieniem obiektu.

    Rozkładające, w C++, byłoby {Foo foo = Foo();} , tzn. najpierw jest
    tworzony tymczasowy obiekt Foo (przez wywołanie konstruktora), potem
    następowałoby kopiowanie tymczasowego obiektu na foo... "zaszyte w
    konstruktor run()" byłoby odpalane w mało przewidywalny sposób. Ale podobna
    składnia w Javie wydaje się być znacznie bezpieczniejsza, bo { Foo foo = new
    Foo(); } nie używa /obiektu/ foo, ale /referencji-do-obiektu-foo/, czyli w
    C++ byłoby to { Foo& foo = Foo(); }

    Z drugiej strony Java będzie pewnie miała mały problem - nie wiadomo kiedy
    będzie niszczony obiekt foo (i czy w ogóle).

    A ponadto - osobliwie ciekawe pytanie, raczej C++/C# - czy możliwe jest
    destrukcja obiektu już w tego obiektu konstruktorze?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: