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

Dlaczego rezulatat operatora przypisania '=' jest referencją?

Ostatnio zmodyfikowano 2017-01-03 19:19
Autor Wiadomość
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 ;)
P-155876
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
C/C++
class HeavyClass
{
    // many, many properties, arrays etc.
   
    HeavyClass operator =( const HeavyClass & hc )
    {
        if( & hc == this ) { return this; }
       
        // assignments
       
        return * this;
    }
};

//main

HeavyClass h1;
h1 = h1;
P-155879
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...
P-155880
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:
C/C++
HeavyClass operator =( const HeavyClass & hc )
{
    if( & hc == this ) { return this; }
   
    // assignments
   
    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
C/C++
//w ten sposob?
P-155892
michal11
» 2017-01-03 18:01:17
Przez pomyłkę, powinna tam być dereferencja.
P-155894
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ł.
P-155909
1 « 2 »
Poprzednia strona Strona 2 z 2