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ć ? |
|
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. |
|
michal11 |
» 2015-10-05 12:27:26 |
|
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
|
|
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
const QList < int >& tablica = func();
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>. |
|
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!!! #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; tabl.skladnik = 13; return tabl; }
int main() { A temp; temp = func(); 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ę. |
|
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: #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 ) { cout << z_1.x + z_2.x << "+" << z_1.y + z_2.y << "i" << endl; }
void funkcja( const 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 ? |
|
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 :) #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 ) { cout << z_1.x + z_2.x << "+" << z_1.y + z_2.y << "i" << endl; }
void funkcja( const 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; }
|
|
« 1 » 2 3 |