Ĺadny brzuch
Witam wszystkich. Pytanie jest jak w opisie tematu. Nie chodzi mi o to, dlaczego zwracamy referencję w jakiejś funkcji, chodzi mi o to, dla jakich operatorów zwracamy referencję, a dla jakich nie. I dlaczego.
Np. dla operatora "[]" najczęściej zwracamy referencję. Jest to potrzebne do takiej operacji:
tab[1] = zmienna; /*zmienna jest typu zdefiniowanego, tab to tablica elementów tego samego typu*/
Ale dla operatora "=" to już nie wiem, czemu jest referencja.
Albo czy dla operatora "+" jest jakieś przeciwskazanie co do używania referencji? Tak, nie skompiluje się :P
Użytkownik twono edytował ten post 16 luty 2007, 23:31
jak użyjesz + do zmiennej np. &a, to dodasz adres komórki pamięci, w której jest przechowywane to a.
jeżeli faktycznie o to Ci chodzi, to nie ma przeciwskazań:)
Nie o to mi chodzi w tym pytaniu. Chodzi mi o dwie wersje tej samej funkcji:
Klasa operator+(const Klasa &a); Klasa &operator+(const Klasa &a);
Obie wersje działają, przynajmniej w przewidzianych przeze mnie przypadkach. Ale czy jest jakaś "ukryta wada" drugiej metody?
Co do operatora '='. Wcale nie musisz zwracać referencji... możesz w nim nic nie zwracać... jednakże, gdy zwrócisz referencję będzie możliwy taki zapis:
klasa jakas1, jakas2, jakas3; jakas1 = jakas2; // w tym momencie nie potrzebne jest zwracanie referencji jakas3 = jakas2 = jakas1; // ale tutaj musisz przeładować operator, żeby zwracał referencję inaczej kompilator zgłosi błąd
Chodzi o to, że kompilator rozpatruje operator przypisania od prawej strony, czyli operacje będą wykonywane tak :
(jakas3 = (jakas2 = jakas3)) // jak "jakas2" nie zwróci refernecji nie będzie to zapis akceptowalny ;)
Użytkownik T.Q. edytował ten post 16 luty 2007, 19:35
Wystarczy (?), że zwrócę wartość, a drugi wariant będzie możliwy. A właśnie mnie najbardziej interesuje różnica między zwróconą wartością a referencją. Jakby ktoś miał wątpliwości:
Klasa operator=(const Klasa &rhs); Klasa &operator=(const Klasa &rhs); Â Â //po co znak &
Jedyną różnicę, którą widzę, to kwestia wydajności. W drugim wariancie nie trzeba tworzyć nowego obiektu przy zwracaniu. Chciałbym od razu mieć poprawne spojrzenie na tę sprawę, żeby potem nie trzeba zmienić nawyku.
Wystarczy (?), że zwrócę wartość, a drugi wariant będzie możliwy. A właśnie mnie najbardziej interesuje różnica między zwróconą wartością a referencją. Jakby ktoś miał wątpliwości:
Klasa operator=(const Klasa &rhs); Klasa &operator=(const Klasa &rhs); //po co znak &
Jedyną różnicę, którą widzę, to kwestia wydajności. W drugim wariancie nie trzeba tworzyć nowego obiektu przy zwracaniu. Chciałbym od razu mieć poprawne spojrzenie na tę sprawę, żeby potem nie trzeba zmienić nawyku.
I to jest jedyna różnica, chodzi właśnie o wydajność, bo po co tworzyć nie potrzebny "tymczasowy" obiekt?. Tak samo jest dla argumentu przyjmujesz referencję, żeby nie tworzyć dodatkowych obiektów.
Jako ciekawostkę dodam że "const" w argumencie jest nie po to żeby nie zmieniać obiektu, ale żeby móc przyjmować "tymczasowe" obiekty.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Np. dla operatora "[]" najczęściej zwracamy referencję. Jest to potrzebne do takiej operacji:
tab[1] = zmienna; /*zmienna jest typu zdefiniowanego, tab to tablica elementów tego samego typu*/
Ale dla operatora "=" to już nie wiem, czemu jest referencja.
Albo czy dla operatora "+" jest jakieś przeciwskazanie co do używania referencji? Tak, nie skompiluje się :P
Użytkownik twono edytował ten post 16 luty 2007, 23:31
jak użyjesz + do zmiennej np. &a, to dodasz adres komórki pamięci, w której jest przechowywane to a.
jeżeli faktycznie o to Ci chodzi, to nie ma przeciwskazań:)
Nie o to mi chodzi w tym pytaniu. Chodzi mi o dwie wersje tej samej funkcji:
Klasa operator+(const Klasa &a); Klasa &operator+(const Klasa &a);
Obie wersje działają, przynajmniej w przewidzianych przeze mnie przypadkach. Ale czy jest jakaś "ukryta wada" drugiej metody?
Co do operatora '='. Wcale nie musisz zwracać referencji... możesz w nim nic nie zwracać... jednakże, gdy zwrócisz referencję będzie możliwy taki zapis:
klasa jakas1, jakas2, jakas3; jakas1 = jakas2; // w tym momencie nie potrzebne jest zwracanie referencji jakas3 = jakas2 = jakas1; // ale tutaj musisz przeładować operator, żeby zwracał referencję inaczej kompilator zgłosi błąd
Chodzi o to, że kompilator rozpatruje operator przypisania od prawej strony, czyli operacje będą wykonywane tak :
(jakas3 = (jakas2 = jakas3)) // jak "jakas2" nie zwróci refernecji nie będzie to zapis akceptowalny ;)
Użytkownik T.Q. edytował ten post 16 luty 2007, 19:35
Wystarczy (?), że zwrócę wartość, a drugi wariant będzie możliwy. A właśnie mnie najbardziej interesuje różnica między zwróconą wartością a referencją. Jakby ktoś miał wątpliwości:
Klasa operator=(const Klasa &rhs); Klasa &operator=(const Klasa &rhs); Â Â //po co znak &
Jedyną różnicę, którą widzę, to kwestia wydajności. W drugim wariancie nie trzeba tworzyć nowego obiektu przy zwracaniu. Chciałbym od razu mieć poprawne spojrzenie na tę sprawę, żeby potem nie trzeba zmienić nawyku.
Wystarczy (?), że zwrócę wartość, a drugi wariant będzie możliwy. A właśnie mnie najbardziej interesuje różnica między zwróconą wartością a referencją. Jakby ktoś miał wątpliwości:
Klasa operator=(const Klasa &rhs); Klasa &operator=(const Klasa &rhs); //po co znak &
Jedyną różnicę, którą widzę, to kwestia wydajności. W drugim wariancie nie trzeba tworzyć nowego obiektu przy zwracaniu. Chciałbym od razu mieć poprawne spojrzenie na tę sprawę, żeby potem nie trzeba zmienić nawyku.
I to jest jedyna różnica, chodzi właśnie o wydajność, bo po co tworzyć nie potrzebny "tymczasowy" obiekt?. Tak samo jest dla argumentu przyjmujesz referencję, żeby nie tworzyć dodatkowych obiektów.
Jako ciekawostkę dodam że "const" w argumencie jest nie po to żeby nie zmieniać obiektu, ale żeby móc przyjmować "tymczasowe" obiekty.