Dlaczego rezulatat operatora przypisania '=' jest referencją?
Ostatnio zmodyfikowano 2017-01-03 19:19
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-01-03 14:20:01 Chwila... Przeciez zwracajac kopie konstruktor przypisuje ją do obiektu na rzecz ktorego jest wywolywany. Class klasa {Int x} A = b Na rzecz obiektu A X = B.x; Return *this
Tworzona jest kopia this i jest przypisywana do obiektu A. Kopia znika i tyle, gdzie tu jest błąd? Bo Grebosz pisał, ze trzeba zwracac przez referencje. Za to mateczek pisze że nie. Oczywiscie w odniesieniu do zapisu a=b=c a nie tylko a=b. proszę, po kolei i łopatologicznie ;) |
|
michal11 |
» 2017-01-03 14:54:26 Wyobraź sobie, że masz bardzo rozbudowaną klasę, bardzo dużo zmiennych składowych, kilkanaście dynamicznych alokacji, tablice itd. I teraz pomyśl co się stanie jeżeli będziesz zwracał obiekt przez kopię z operatora= (albo innej dowolnej funkcji), zastanów się co się stanie jeżeli przez pomyłkę zrobisz coś takiego class HeavyClass { HeavyClass operator =( const HeavyClass & hc ) { if( & hc == this ) { return this; } return * this; } };
HeavyClass h1; h1 = h1;
|
|
mokrowski |
» 2017-01-03 15:11:50 @latajacaryba, to że _można_ nie znaczy że trzeba :-) @mateczek napisał że można. Ja także użyłem w przykładzie gdzie to było potrzebne czyli przy operator++(int). Unikaj kopii i sygnalizuj w kodzie czego oczekujesz i co dajesz. Przez referencję sygnalizujesz że nie zwracasz kopii. Przy braku referencji sygnalizujesz że zwracasz kopię. Powinieneś mieć powód aby zwracać kopię. Złym powodem jest "bo mogę". Co zrobisz w kodzie, twoja sprawa ale nie zaskakuj kogoś kto czyta kod i tyle :-) Proszę bardzo .. "w temacie" co można a czego się spodziewać. Powiedz czy takie "badziewie" by cię nie wkurzyło jeśli ktoś by to zrobił w kodzie i powiedział "bo można" :-/ Tu krótki przykład ale gdyby to był program na 1k linii :-/ #include <iostream>
using namespace std;
int main() { int * a = nullptr; // ... // wiele kodu... //... int & ref_a = *a; cout << ref_a << endl; }
Za każdym razem się wywraca a jak popatrzysz: "to przecież referencja, ona nie może być zła!" Nie zaskakuj... |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-01-03 17:32:45 Nie bardzo załapałem ten przykład(up), bo tu ewidentnie jest to zrobione, żeby program się wykrzaczył, ale pojmuje idee. Ale jeszcze krótkie pytanko :D Jak się domyślam podobnie jest z argumentem i też warto przesyłać go przez referencję? @michal1 Trochę nie bardzo łapie to: HeavyClass operator =( const HeavyClass & hc ) { if( & hc == this ) { return this; } return * this; }
Jeśli adres argumentu == this(adresowi obiektu), to zwracamy this. Dlaczego zwracasz wskaźnik? @mokrowski I tak na marginesie z ciekawości - co Ci się nie podoba w umieszczaniu kodu |
|
michal11 |
» 2017-01-03 18:01:17 Przez pomyłkę, powinna tam być dereferencja. |
|
mateczek |
» 2017-01-03 19:19:02 operator to funkcja i jak ją napiszesz to twój wybór!!! przykład podałem tylko dlatego by pokazać że można. I wcale nie dlatego, że to dobry pomysł.
|
|
1 « 2 » |