Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Referencje

Ostatnio zmodyfikowano 2015-10-08 21:12
Autor Wiadomość
ast44
Temat założony przez niniejszego użytkownika
Referencje
» 2015-10-05 11:37:39
Witam ,mam problem w zrozumieniu dlaczego jeśli podam że chcę przekazywać przez referencję to potem jak wywołują daną funkcję, nie ma różnicy z przekazywaniem przez wartość ( w obu przypadkach wpisuję nazwę obiektu ).

PS.Przepraszam za moją ignorancję ale dawno nie byłem na forum i nie pamiętam w jakich tagach wstawiało się kod. Mógłby ktoś przypomnieć ? 
P-138169
Szadziu
» 2015-10-05 11:39:51
Jak zmienisz wartość zmiennej w funkcji gdzie argument przekazano przez referencję, wartość zostanie zmieniona także w funkcji "na zewnątrz". W przypadku normalnego przekazania, będzie to podmiana tylko lokalna. Zrób sobie przykład z takimi samymi funkcjami które dodają do zmiennej np. 1 i wyświetl wartość przed wejściem do funkcji i po wyjściu.
P-138170
michal11
» 2015-10-05 12:27:26
W zasadzie to nie do końca zrozumiałem o co ci dokładnie chodzi (może wklej kod ?).

To może rozwiać twoje wątpliwości: http://cpp0x.pl/kursy/Kurs-C++​/Poziom-3​/Przekazywanie-argumentow-funk​cji-przez-referencje​/356
P-138171
mateczek
» 2015-10-05 12:48:01
Referencja traktuj jako: namiar na obiekt(zmienną), przezwisko lub inną nazwę dla zmiennej. trochę coś jak wskaźnik!!!

Przekazywanie przez wartość to robienie kopi zmiennej!!! (w funkcji jest prywatna zmienna o wartości zgodnej z oryginałem)

https://pl.wikibooks.org/wiki/Programowanie_C%2B%2B_Qt4_w_systemie_Gnu-Linux/Referencje_w_C%2B%2B
P-138172
Monika90
» 2015-10-05 14:30:02
Z tego artykułu https://pl.wikibooks.org/wiki/Programowanie_C%2B%2B_Qt4_w_systemie_Gnu-Linux/Referencje_w_C%2B%2B

C/C++
const QList < int >& tablica = func(); //ustawiamy referencję na zwrócony kontener

Czy coś takiego może się przydać?? Może się przydać przy przeglądaniu kontenerów zawierających duże obiekty. Jeśli jakaś funkcja zwraca obiekt przez wartość, To lepiej jest ustawić referencję na ten zwrócony obiekt, niż kopiować go składnik po składniku.
Jeśli chodzi o kopiowanie, to ta referencja niczego nie zmienia. Wymusza tylko const, co nie zawsze jest pożądane.
To
const QList < int > tablica = func();
 będzie tak samo wydajne.


Tym razem funkcja zwróci referencję do obiektu utworzonego w zapasie pamięci. Obiekt utworzony za pomocą operatora new
Zły pomysł. Funkcja tworząca nowy obiekt na stercie powinna zwracać std::unique_ptr<T>.
P-138174
mateczek
może przykład z kontenerem nie trafiony!!!
» 2015-10-05 17:23:17
może przykład z kontenerem nie trafiony!!! bo to działa podobnie do tablic i nie kopiuje się tak jak normalny obiekt!!!
C/C++
#include <iostream>
using namespace std;
class A {
public:
    int skladnik;
    A() { cout << "to ja konstruktor zwykły" << endl; }
    A( A & a ) {
        cout << "to ja konstruktor kopiujący" << endl;
    }
    void operator =( const A & a ) {
        cout << "to ja operator przypisania" << endl;
    }
};



A func()
{
    A tabl; // tutaj 1
    //gdy będziemy zwracać przez referencję tylko ten konstruktor się odpali
    tabl.skladnik = 13;
    return tabl;
}


int main()
{
    A temp; // tutaj 2
    temp = func(); //tutaj 3
    cout << "-------------------------------" << endl;
    const A & t = func();
   
}

po skompilowaniu mamy


to ja konstruktor zwykły
to ja konstruktor zwykły
to ja operator przypisania
-------------------------------
to ja konstruktor zwykły
Naciśnij <RETURN> aby zamknąć to okno...


Przy zwracaniu przez wartość odpaliły się aż 3 funkcje. Przy referencji jedna. Więc myślę że warto jest znać ten sposób dobrania się do wyniku zwracanego przez funkcję.
P-138176
ast44
Temat założony przez niniejszego użytkownika
» 2015-10-05 17:41:24
Nie no rozumiem że jak robię przez referencję to działam na oryginale (coś tak jak wskaźnik, tylko referencji nie można modyfikować i używa się jej normalnie jak zmiennej), a jak przez wartość ("normalnie") to robi się kopie i zmiany są widoczne tylko w danej funkcji.Mi chodzi o coś takiego np:

C/C++
#include <iostream>

using namespace std;

class zespolone
{
public:
    int x, y;
    zespolone( double _x, double _y )
    {
        x = _x;
        y = _y;
    }
};

void operator +( const zespolone & z_1, const zespolone & z_2 ) // Działa też dla po prostu : zespolone z_1, zespolone z_2 ,czyli przekazywanie "normalne"
{
    cout << z_1.x + z_2.x << "+" << z_1.y + z_2.y << "i" << endl;
}

void funkcja( const zespolone & zesp, int & a ) // Tutaj tak samo jak wyżej.Mogło być po prostu : zespolone zesp,int a
{
    cout << zesp.x + a << "+" << zesp.y << "i" << endl;
}

int main()
{
    zespolone z_1( 1, 1 ), z_2( 2, 2 );
   
    z_1 + z_2;
   
    zespolone & z_1_ref = z_1;
    zespolone & z_2_ref = z_2;
   
    z_1_ref + z_2_ref;
   
    int a = 5;
    int & b = a;
   
    funkcja( z_1, b );
    funkcja( z_1_ref, b );
   
    return 0;
}

Wziąłem jedno przeciążanie operatora i jedną zwykłą funkcję.I w każdym przypadku jest tak samo.Niezależnie co zadeklaruję (czy przekazywanie przez referencję czy przez wartość - "normalnie") i co potem tam wrzucę (np: zadeklarowałem referencję wrzucam referencję albo wartość i odwrotnie ,zadeklarowałem przez wartość a wrzucam przez wartość albo referencję) to zawsze to dobrze działa.Dlaczego tak jest ?
P-138177
mateczek
» 2015-10-05 18:17:45
bo referencja to przezwisko inna nazwa dla zmiennej
posługujesz się tak jak zwykłą zmienną dlatego działa. Jak chcesz to można ten kod troszku popsuć :) teraz już przez wartość zespolonych nie dodasz :)
C/C++
#include <iostream>

using namespace std;

class zespolone
{
public:
    zespolone( const zespolone & z ) { x = 0, y = 0; cout << "kopiuje składniki jestem oszust nie pracuję na oryginalnych" << endl; }
    int x, y;
    zespolone( double _x, double _y )
    {
        x = _x;
        y = _y;
    }
};

void operator +( const zespolone z_1, const zespolone z_2 ) // Działa też dla po prostu : zespolone z_1, zespolone z_2 ,czyli przekazywanie "normalne"
{
    cout << z_1.x + z_2.x << "+" << z_1.y + z_2.y << "i" << endl;
}

void funkcja( const zespolone & zesp, int & a ) // Tutaj tak samo jak wyżej.Mogło być po prostu : zespolone zesp,int a
{
    cout << zesp.x + a << "+" << zesp.y << "i" << endl;
}

int main()
{
    zespolone z_1( 1, 1 ), z_2( 2, 2 );
   
    z_1 + z_2;
   
    zespolone & z_1_ref = z_1;
    zespolone & z_2_ref = z_2;
   
    z_1_ref + z_2_ref;
   
    int a = 5;
    int & b = a;
   
    funkcja( z_1, b );
    funkcja( z_1_ref, b );
   
    return 0;
}
P-138180
« 1 » 2 3
  Strona 1 z 3 Następna strona