Article View: pl.comp.objects
Article #4737Re: Prawda o C++
From: Marcin 'Qrczak' Kowalczyk
Date: Mon, 18 Jan 1999 20:53
Date: Mon, 18 Jan 1999 20:53
100 lines
4118 bytes
4118 bytes
On 18 Jan 1999, Sektor van Skijlen wrote:
> Dlaczego niby kojarzycie referencje ze wskaznikami ? To bez sensu.
> Referencje to zupelnie co innego. Referencje moga CZASEM BYC
> zaimplementowane przez wskazniki, ALE NIE MUSZA!
Nieprawda. Referencja to jest praktycznie to samo co wskaźnik. Różni się
wyłącznie składnią, przy czym niektóre operacje na wskaźnikach nie mają
odpowiedników na referencjach.
To, że niektórzy ludzie lubią sobie o tym myśleć w jakiś inny sposób,
nie zmienia faktu, że referencje zawsze można zastąpić równoważnymi
wskaźnikami (modulo makra i szablony, gdzie te same napisy są analizowane
wiele razy w różnych kontekstach).
> struct CosTam
> {
> int i;
> int k;
> };
>
> ...
> {
> ...
> CosTam* nic = new CosTam[20];
> ...
> int& pk = nic[4].k;
> ...
> pk = 2;
>
> }
>
> Tutaj moze byc zaimplementowana jako wskaznik,
Zgoda.
> ale np. tutaj juz nie:
>
> {
> CosTam* nic = new CosTam;
>
> CosTam& rnic = *nic;
>
> rnic = { 2, 65 };
> }
To się przede wszystkim nie skompiluje (błąd składni w ostatnim
przypisaniu - napis { 2, 65 } nie jest poprawnie zbudowanym wyrażeniem).
Można to uratować następującym rozszerzeniem gcc:
rnic = (CosTam) { 2, 65 };
i jest to taka sama sytuacja jak poprzednio. Referencja może być
zaimplementowana jako wskaźnik i prawdę mówiąc nie widzę innego sensownego
rozwiązania.
> Podobnie np:
>
> struct Cos
> {
> int* tab;
> size_t size;
>
> int& rt;
>
> public:
> Cos( size_t s ): rt( tab[2] )
> {
> size = s;
> tab = new int [size];
> }
> };
>
> Ile bedzie zawierac pol ? Dwa, czy trzy ?
Trzy. Ale kod jest bezsensowny: inicjujesz rt wartością zależną
od wartości zmiennej tab, która sama jest jeszcze w tym momencie
niezainicjowana. Jakiekolwiek późniejsze użycie wartości wskazywanej
przez rt ma pełne prawo wysypać program. Nie wierzysz - sprawdź.
> Aha, zeby nie bylo potem nieporozumien - napisalem to, co mi sie
> wydaje logiczne, standard nie precyzuje przeciez, jak co kompilatory
> maja implementowac. Napisalem tylko to, co mi sie wydaje logiczne.
Obawiam się, że musisz zrewidować swoje poglądy na temat istoty
referencji.
> A' propos - nie probowalem jeszcze kopiowac obiektow zawierajacych
> odniesienia. Wydaje mi sie (jeszcze nie sprawdzalem, bo mi sie nie
> chce), ze trzeba bedzie zrobic normalnie konstruktor (w tym i
> kopiujacy), ktory przypisze odniesieniom odpowiednie obiekty docelowe.
Domyślnego operatora przypisania w takich przypadkach nie ma (egcs mówi:
non-static reference member `...', can't use default assignment operator).
I trudno tutaj sensownie zaimplementować własny.
--
__("< Marcin Kowalczyk * qrczak@knm.org.pl http://kki.net.pl/qrczak/
\__/ GCS/M d- s+:-- a21 C+++>+++$ UL++>++++$ P+++ L++>++++$ E->++
^^ W++ N+++ o? K? w(---) O? M- V? PS-- PE++ Y? PGP->+ t
QRCZAK 5? X- R tv-- b+>++ DI D- G+ e>++++ h! r--%>++ y-
Technical Details
Message-ID:
<Pine.LNX.4.05.9901182050560.542-100000@qrnik.knm.org.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.nask.pl!orion.cst.tpsa.pl!news.tpnet.pl!not-for-mailReferences:
<77o3bl$j0q$1@polonez.man.lodz.pl> <369FDDCE.7B94748A@interdata.com.pl> <77q41i$j7f$1@polonez.man.lodz.pl> <wU3o2.25549$U1.4744058@news.tpnet.pl> <77qi2q$42a$1@polonez.man.lodz.pl> <77qk38$ken$1@zeus.polsl.gliwice.pl> <77vn97$j3l$1@polonez.man.lodz.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.nask.pl!orion.cst.tpsa.pl!news.tpnet.pl!not-for-mail From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl> Newsgroups: pl.comp.lang.c,pl.comp.objects Subject: Re: Prawda o C++ Organization: Klub Nieszkodliwych Manjaków Lines: 101 Message-ID: <Pine.LNX.4.05.9901182050560.542-100000@qrnik.knm.org.pl> References: <77o3bl$j0q$1@polonez.man.lodz.pl> <369FDDCE.7B94748A@interdata.com.pl> <77q41i$j7f$1@polonez.man.lodz.pl> <wU3o2.25549$U1.4744058@news.tpnet.pl> <77qi2q$42a$1@polonez.man.lodz.pl> <77qk38$ken$1@zeus.polsl.gliwice.pl> <77vn97$j3l$1@polonez.man.lodz.pl> Mime-Version: 1.0 In-Reply-To: <77vn97$j3l$1@polonez.man.lodz.pl> Date: Mon, 18 Jan 1999 20:53:37 GMT NNTP-Posting-Host: 195.205.246.23 X-Complaints-To: abuse@tpsa.pl X-Trace: news.tpnet.pl 916692817 195.205.246.23 (Mon, 18 Jan 1999 21:53:37 MET DST) NNTP-Posting-Date: Mon, 18 Jan 1999 21:53:37 MET DST Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit