Article View: pl.comp.objects
Article #4740Re: Prawda o C++
From: Sektor van Skijlen
Date: Tue, 19 Jan 1999 19:29
Date: Tue, 19 Jan 1999 19:29
149 lines
6074 bytes
6074 bytes
In pl.comp.lang.c Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl> wrote:
: podanie kontrprzykładu. Proszę więc o kawałek kodu używającego referencji,
: którego nie da się w trywialny sposób przerobić na wskaźniki.
Sorki... kazdy da sie... tylko nie kazdy trzeba. I to wlasnie usiluje
wytlumaczyc.
:> Ok, przyznaje sie. Zamienmy to na:
:>
:> CosTam dwa( 5, 5 ); // powiedzmy, ze to ma taki konstruktor
:>
:> rnic = dwa;
: I gdzie tu jest przykład, że referencje istotnie różnią się od wskaźników?
: Na wskaźnikach wyglądałoby to tak:
: CosTam *rnic = nic;
: ...
: *rnic = dwa;
:> : 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.
:>
:> Niestety kompletna bzdura, kolego. Zmiennej rnic w ogole nie bedzie. Zamiast
:> tego, kompilator to przypisanie zamieni na rownowazne:
:>
:> *nic = dwa;
: [qrczak ~]$ cat ref1.cc
: #include <iostream.h>
: class CosTam
: {
: public:
: int i, k;
: CosTam (int ii, int kk) : i (ii), k (kk) {}
: };
: main()
: {
: CosTam *nic = new CosTam (0, 0);
: CosTam &rnic = *nic;
: CosTam dwa (5, 5);
: nic = new CosTam (9, 9);
: rnic = dwa;
: cout << rnic.i << dwa.i << nic->i << "\n";
: return 0;
: }
: [qrczak ~]$ ./ref1
: 559
: [qrczak ~]$ g++ --version
: egcs-2.91.60
: Jeśli kompilator zamienił to przypisania na *nic = dwa, to jakim cudem
: wartości *nic i dwa są potem różne?
Alez kombinujesz... powiedzialem Ci, ze W TYM KONKRETNYM przypadku nie zmieni,
w przykladzie, ktory podales juz tak nie bedzie, bo dales nowe przypisanie do
'nic', wiec zmienna rnic juz musi w tym przypadku istniec (bo referuje do
obiektu).
:> A teraz maly tescik dla grupowiczow.
:>
:> Zmienna referencyjna to zmienna, jak kazda inna, tak ?
:> Operator & uzyskuje adres zmiennej, tak ?
:>
:> No wiec prosze powiedziec, co zwroci wyrazenie &ref, gdzie ref jest dowolna
:> zmienna referencyjna ?
: Wskaźnik na obiekt wskazywany przez ref.
: Nie twierdziłem nigdy, że "to jest zmienna jak każda inna", co by miało
: pewnie znaczyć, że nie ma własności wyróżniającej referencje spośród
: innych typów. Są takie własności. Ale co chcemy tutaj pokazać?
Przede wszystkim - nie jest mozliwe uzyskanie adresu zmiennej referencyjnej. A
uzyskac adres zmiennej wskaznikowej ZAWSZE mozna. W podanym przykladzie (kogut
i kura) jesli Ci sie zachce dostepu do adresu zmiennej wskaznikowej, ktora
zostala usunieta przez optymizacje, to kompilator niestety bedzie juz musial
ja umiescic.
Poniewaz zmienne referencyjne nie posiadaja mozliwych do odczytania adresow,
totez moze ich w ogole nie byc. Ze zmiennymi wskaznikowymi nie jest tak
dobrze, acz - jak wlasnie pokazales - czasem sie da.
Chcialem przez to zasugerowac jedna rzecz:
(template < typename tT >)
tT & zmienna
Moze odpowiadac wskaznikowi
tT *const zmienna
I jesli zmienna referencyjna jest zrealizowana poprzez wskaznik (a tak jest
najczesciej), to bedzie fizycznie odpowiadac takiej deklaracji (tylko jest
roznica w skladni). I - prawde mowiac - jesli nigdzie w programie nie zazadamy
adresu takiej zmiennej, to fizycznie zmiennej wskaznikowej rowniez moze nie
byc.
:> Jesli zmienne referencyjne naleza do pol, to niestety jest to dla mnie troche
:> dziwne. Bo jezeli mamy taka strukture:
:>
:> struct Krotka
:> {
:> int a;
:> const int d = 2;
:> };
:>
:> to pole d niby nalezy do pol struktury, a jednak struktura ma te sama
:> wielkosc, co int...
: Ano ma. Ale gdzie tu mamy referencje?
Referencji nie ma, ale jest OBIEKT STALY.
:> To pierwsze zreszta, to tylko rozszerzenie GCC, standard zabrania
:> takich inicjalizacji...
: W gcc też jest niemile widziane:
: ref3.cc:5: warning: ANSI C++ forbids initialization of const member `d'
: ref3.cc:5: warning: making `d' static
Moj widocznie nie jest taki -pedantic jak twoj :*))
:> Szczerze mowiac, nie rozumiem, dlaczego nie moznaby zrobic tego tak, zeby
:> zmienna nie istniala.
: W którym przypadku?
Tym, ktory sego czasu wyroznilem.
: Jest istotne. Bo jeśli napiszesz:
: int &f();
: int &a = f();
: to byłoby bez sensu, żeby przy każdym odwołaniu do zmiennej a była
: wywoływana funkcja f(). Więc wartość a musi być gdzieś zapamiętana.
: Jest zapamiętana tam, gdzie byłaby zapamiętana, gdyby nie była referencją.
Hmm... masz najzupelniej racje (szczegoly omowilem wczesniej), ale... a jakby
bylo 'int & volatile a;' ? Nie probowalem co prawda, ale wiem, ze nie bedzie
roznicy w stosunku do wskaznika... :*)) Moznaby to umiescic w standardzie,
raczej watpie, zeby ktos takiej konstrukcji uzywal...
--
-=* P O Z D R A W I A M ! *=-
[-=* Ij waiet salden mijn spijr, ta faenen aire ats trauven diaenna *=-]
____....----````Sektor van Skijlen: sektor at beer.com''''----....____
<sPAm @ pROtEctIOn>
Technical Details
Message-ID:
<782meu$cbs$1@polonez.man.lodz.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.task.gda.pl!news.man.lodz.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> <Pine.LNX.4.05.9901182050560.542-100000@qrnik.knm.org.pl> <78256q$9l8$5@polonez.man.lodz.pl> <Pine.LNX.4.05.9901191914060.379-100000@qrnik.knm.org.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.task.gda.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <sektor@spam.org>
Newsgroups: pl.comp.lang.c,pl.comp.objects
Subject: Re: Prawda o C++
Date: 19 Jan 1999 19:29:34 GMT
Lines: 149
Message-ID: <782meu$cbs$1@polonez.man.lodz.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> <Pine.LNX.4.05.9901182050560.542-100000@qrnik.knm.org.pl> <78256q$9l8$5@polonez.man.lodz.pl> <Pine.LNX.4.05.9901191914060.379-100000@qrnik.knm.org.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
User-Agent: tin/pre-1.4-981225 ("Volcane") (UNIX) (SunOS/5.5.1 (i86pc))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit