Article View: pl.comp.objects
Article #15695Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
From: SasQ
Date: Thu, 22 Feb 2007 19:14
Date: Thu, 22 Feb 2007 19:14
122 lines
5909 bytes
5909 bytes
Dnia Fri, 15 Dec 2006 17:10:05 +0000, Kamil Konieczny napisał(a):
> T.2.4 Jak w C++ obsluguje sie funkcje ze zmienna liczba parametrow?
>
> W starym C stosowalo sie <varargs.h>, w nowym (ANSI C oraz C++)
> stosuje sie <stdarg.h>
Jeśli mowa o C++, to chyba raczej <cstdarg>
> void main()
Jeśli przykład był dla C++, to raczej int main().
Standard ANSI/ISO C++ nie dopuszcza void dla main.
> T.2.6 Czy stosowanie zaprzyjazniania klas nalezy do dobrej
> praktyki rogramisty?
>
> Nie, gdyz dopuszcza do latwego dostepu do pol prywatnych i
> chronionych.
Ale nie każdemu ;) Tylko wybranym.
Przyjaźń wcale nie jest "zamachem na enkapsulację", bo klasa
deklarująca przyjaźń sama decyduje o tym, z kim się przyjaźni
i robi to z pełną świadomością ;) Poza tym jeśli już jest
deklaracja przyjaźni, to jest ona częścią interfejsu klasy i
daje sygnał, że dwie klasy są ze sobą ściśle powiązane i
działają wspólnie.
> T.2.9 Co to jest konstruktor kopiujacy?
>
> Konstruktor kopiujacy jest bardzo podobny do operatora przypisania,
> tyle ze o ile operator przypisania uzywany jest dla obiektow juz
> istniejacych, to konstruktor kopiujacy gdy tworzymy nowy obiekt i
> jednoczesnie nadajemy mu jakas wartosc. Przyklad (bo bez przykladu
> raczej malo kto zrozumie :-) ):
Czemu? Po prostu chodzi o zwyczajną inicjalizację nowo tworzonego
biektu wartością innego obiektu tego samego typu ;)
> main()
A typ wartości zwracanej to zjadł pies? :P
> A d; // A tutaj operator przypisania z tym samym argumentem
Raczej linijkę niżej ;) o tu:
> d=b;
> Konstruktor kopiujacy jest tylko i wylacznie wtedy gdy
> przypisanie nastepuje rownoczesnie z utworzeniem.
Ale wtedy to nie jest przypisanie, tylko inicjalizacja ;P
Przypisuje się do obiektów już skonstruowanych.
Jak nie łapiesz różnicy, to spróbuj z obiektami const:
można je tylko inicjalizować, ale nie można do nich już
później przypisywać.
> Dlaczego to wyroznienie? Pozwala to zaoszczedzic operacji,
> bo oczywiscie moglo by byc i tak ze kazda instrukcja typu
> "A b=c;" bylaby rozbijana na dwie: "A b; b=c;".
Tu akurat nie to jest najważniejsze ;)
Ponownie polecam popróbować z const ;)
Jeśli obiekt jest const, nie możesz do niego już nic przypisać
po utworzeniu. Jeśli chcesz ustawić wartość obiektu stałego
"na wzór" innego obiektu, to jedyny moment, gdzie jest to możliwe,
jest przy konstruowaniu. Później jest już "po ptokach" :P
I tu się właśnie przydaje konstruktor kopiujący, zwany też
"inicjalizatorem kopiującym" ;J
> Ale wtedy niepotrzebnie obiekt "b" bylby dwa razy inicjowany
Inicjuje się czynności. Obiekty się inicjalizuje.
I nie słuchaj słownika Kopalińskiego, jego autorzy nie wiedzą
co to jest programowanie ;)
> Najbardziej znane przyklady sprytnych wskaznikow to string
> (opakowujacy wskaznik do char)
?? :P
Tak rozumując, to każda klasa, która zawierałaby w swojej
implementacji jakieś wskaźniki i je obsługiwała, musiałaby
być "sprytnym wskaźnikiem" :P Ja bym raczej zawęził ten termin
do obiektów "symulujących" zwykłe wskaźniki w widoczny sposób.
> Opisuje to wzorzec Abstract Factory z ksiazki "Design
> Patterns", Gamma et al.
"et al." to skrót od łacińskiego "et alii" = "i inni" ;J
> Klasa abstrakcyjna jest kazda klasa, ktora ma choc jedna metode
> czysto wirtualna (abstrakcyjna), czyli zadeklarowana, a nie
> zaimplementowana. Mozna klase uczynic abstrakcyjna takze deklarujac
> wszystkie jej konstruktory jako prywatne lub chronione (protected).
No nie wiem ;J
Uczynienie konstruktora prywatnym lub chronionym jeszcze nie
czyni klasy abstrakcyjną, bo obiekty tej klasy wbrew pozorom
nadal mogą być tworzone, tylko nie każdemu wolno to robić ;J
Jeśli konstruktor jest private, to wolno tworzyć obiekt tylko
z wnętrza klasy, a jeśli protected, to dodatkowo z wnętrza
klas pochodnych. Klasa "dla samej siebie" albo "dla siebie i
rodzinki" nie jest już wtedy wcale abstrakcyjna. Podobnie
jeśli klasa ma prywatny konstruktor, ale przyjaźni się z
jakąś funkcją która może ten konstruktor prywatny wtedy wywołać
i utworzyć obiekty tej klasy, to klasa już nie może być traktowana
jako abstrakcyjna :P
Dlatego zawęziłbym tą definicję tylko dla klas, które mają
choć jedną metodę czysto wirtualną, bo tylko to daje pełną
gwarancję, że nie powstanie żaden obiekt tej klasy, choćby i
na jej własny użytek prywatny ;J
Klasa Ssak jest dobrym przykładem klasy abstrakcyjnej. Jeśli
chciałbyś ją uzyskać ukrywając konstruktor, to nadal klasa może
stworzyć instancję Ssaka :P [np. z metody statycznej albo
zaprzyjaźnionej] i co wtedy? :D Widziałeś kiedy ssaka luzem? ;)
P.S.: chodziłem z jednym Kamilem Koniecznym do podstawówki :J
Może to ty? :D Jesteś może z Żywca? ;J
--
SasQ
Technical Details
Message-ID:
<pan.2007.02.22.19.13.55.43827@go2.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail From: SasQ <sasq1@go2.pl> Newsgroups: pl.comp.objects Subject: Re: pl.comp.objects FAQ (Frequently Asked Questions and more) Date: Thu, 22 Feb 2007 20:14:01 +0100 Organization: Ganz Automyjnia (i przeróbki ;) Lines: 122 Message-ID: <pan.2007.02.22.19.13.55.43827@go2.pl> References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl> Reply-To: sasq1@go2.pl NNTP-Posting-Host: ccs125.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: nemesis.news.tpi.pl 1172171844 19904 83.30.142.125 (22 Feb 2007 19:17:24 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Thu, 22 Feb 2007 19:17:24 +0000 (UTC) User-Agent: Pan/0.14.2 (This is not a psychotic episode. It's a cleansing moment of clarity.) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit