Referencja a wska?żnik

0

Mma pytanie jaka jest róznica w przekazywaniu do funkcji jakies zmiennej gdy to robimy przez referencje albo gdy przez wskaźnik ??

przeciez w obu wypadkach przesyłamy adres tej zmiennej ...

0

Roznica jest niewielka, poza tym, ze wywolujac funkcje przyjmujaca wskaznik, musisz przeslac albo wskaznik, albo wyluskac go z jakiegos obiektu. Przy referencji podajesz tylko obiekt, a funkcja sama wyluska wskaznik. Ja preferuje wskazniki, bo przynajmiej wiesz, ze funkcja ten i ten obiekt bedzie zmieniala, przy referencji jest to dos niebezpieczne.

0

Tylko nadmienie, ze referencje sie glownie stosuje do przekazywania obiektow stalych.
Sa to wtedy const-referencje. Wtedy jakos kod ladniej wyglada.

0

faktycznie roznice miedzy referencja a wskaznikiem sa bardziej zlozone. Przekazujac wskaznik jako parametr do funkcji powodujesz, ze funkcja operuje bezposrednio na tym obiekcie na ktory wskazuje wskaznik. Literatura podaje, ze referencja jest jedynie synonimem obiektu - jest to tylko czesciowa prawda. Jezeli przekazujesz parametr jako referencje, wowczas funkcja nie wykonuje operacji bezposrednio na obiekcie (jak w przypadku wskaznika), a pracuje na "kopii lokalnej" tego obiektu.

0

jeżeli pracuje na kopii tego elementu to w jaki sposób jest następnie podmieniana wartość w orginale ??

0

Jezeli przekazujesz parametr jako referencje, wowczas funkcja nie wykonuje operacji bezposrednio na obiekcie (jak w przypadku wskaznika), a pracuje na "kopii lokalnej" tego obiektu.

Czy ja wiem czy na kopii? Chyba jednak nie. Referencja to taki dziwaczny wskaźnik, którego adres jest taki sam jak adres obiektu, którym została zainicjowana. Bo z tego co widzę i rozumiem, adres "normalnego" wskaźnika jest inny niż adres obiektu. Ciekawy jest efekt działania tego kodu:

#include <vcl.h>
#include <conio.h>
#include <iostream>
#pragma hdrstop

using namespace std;

void FunkcjaPtr (int* ptr) {
        cout << &ptr << endl;
}

void FunkcjaRef (int& ref) {
cout << &ref << endl;
}

int main(int argc, char* argv[])
{
        int a = 5;

        cout << &a << endl;
        FunkcjaRef(a);
        FunkcjaPtr(&a);

        getch();
        return 0;
}

A gdyby była tworzona lokalna kopia obiektu - czym by się to różniło od zwykłego przekazywania regularnych obiektów? Bo wtedy jest tworzona taka kopia.

0

void mial racje.
Dla kompilatora nie ma roznicy. Referencja to przekazanie przez wskaznik tylko inaczej zapisane. Inaczej sie odwolujesz do obiektu wewn. funckji - jesli masz wskaznik, to musisz wszedzie wstawic "*" lub "->" zamiast ".".

void funkcja(Klasa* obiekt) {
	obiekt->metoda();
}

void funkcja(Klasa& obiekt) {
	obiekt.metoda();
}

W obu przypadkach wygenerowany kod bedzie identyczny.

0

a pracuje na "kopii lokalnej" tego obiektu.

Tak jest przy przekazywaniu przez wartosc.
Referencja == wskaznik. Roznica jest taka, ze przy referencji, masz automatyczna dereferencje. Kompilator za ciebie przy wywolaniu dopisuje &, a w funkcji bierze dopisuje *.
Mozna zreszta sprawdzic to w generownym kodzie asm.
Podobnie w Delphi (w wersjach chyba od 5), jest juz zatarta roznica pomiedzy referencja i wskaznikiem (mozna wykorzystac referencje, wskaznik lub wskaznik z automatyczna dereferencja...).

0

Bruce Eckel w "Thinking in C++" zaleca stosowanie referencji tak czesto jak to mozliwe. Wedlug niego referencja to po prostu alias obiektu, ktory jest wygodny w uzyciu w zwiazku z automatycznym wyluskiwaniem wartosci. Ponadto, stosujac referencje mozesz byc pewien ze odwoluje sie ona do istniejacego obiektu - nie moze bowiem wskazywac "pustgo" adresu tak jak wskaznik, no i co rownie wazne, nie mozna referencji przypisac innego obiektu niz tego, ktorym zostala zainicjowana

0

Bruce Eckel w "Thinking in C++" zaleca stosowanie referencji tak czesto jak to mozliwe.

Zgadza sie. Ale jeszcze lepiej uzywac wskazniki + garbage collector. Wtedy na dodatek zmniejsza sie ryzyko bledow, poza tym program duzo szybciej sie pisze.

Efekty sa lepsze, bo program sie szybciej wykonuje niz z recznym new i delete. Dzieki temu np. w Javie new dziala do 3 razy szybciej niz malloc/new w C, a free/delete w ogole nie jest wywolywane.

0

Efekty sa lepsze, bo program sie szybciej wykonuje niz z recznym new i delete. Dzieki temu np. w Javie new dziala do 3 razy szybciej niz malloc/new w C, a free/delete w ogole nie jest wywolywane.

nie korzystalem nigdy z tego, ale nasuwa mi sie pytanie: skoro java jest pod praktycznie kazdym wzgledem lepsza i szybsz od c++, to dlaczego programy w niej napisane dzialaja wolniej niz te w c++? niedawno uzywalem takiego fajnego programiku napisanego w Javie, ktory pokazywal zuzyta ilosc miejsca na dysku i rysowal rozne ciekawe wykresy. Design i mozliwosci programu sugerowaly, ze nie napisal go jakis tam laik, tylko ktos dobrze zaznajomiony z programowaniem. Wszystko fajnie, ale golym okiem widac bylo, ze program nie dziala tak szybko jak mozna by tego oczekiwac. tlumacze to sobie tym, ze srodowisko Javy jest traktowane w Windowsie traktowane troche po macoszemu, ale czy to na pewno jedyne wytlumaczenie?

0

Nie napisalem, ze wszystkie programy w Javie chodza szybciej niz w C++. Napisalem tylko o samej alokacji pamieci. W Javie dziala szybciej i lepiej. Za to GUI sie wlecze niemilosiernie. Zwlaszcza SWING jest tragiczny.

Dobra, koncze, bo bylo o wskaznikach. W Javie wskazniki sa calkiem fajne i dobrze, gdyby bylo wiecej dobrych darmowych odsmiecaczy do C++, zeby mozna bylo rownie latwo programowac. Moze ktos z forum napisze taki GC??? W duzych aplikajach wskazniki to straszna zmora. Dlatego zaleca sie uzywac referencji, ktore sa na tyle nieelastyczne, ze po prostu nie da sie wielu rzeczy zrobic i w ten sposob nie da sie popelnic bledow albo Garbage Collectorow, ktore dzialalyby b. ladnie, gdyby nie to, ze dla C++ jest ich jak na lekarstwo. Tak przy okazji przestrzegam przed tzw. reference-counting GC "domowej produkcji" (smart pointers, C++ Boost). Sa beznadziejnie wolne i na dodatek kiepsko dzialaja. Moze walne jakis art o GC tylko zebym mial wiecej czasu... eh...

1 użytkowników online, w tym zalogowanych: 0, gości: 1