[C++] Operatore assegnazione di copia

Messaggioda Dal » 23/09/2019, 23:54

Ciao ragazzi, volevo chiedervi aiuto riguardo al funzionamento del copy assignment operator per una classe. Premetto che sono un fisico quindi non ho conoscenze profondissime del linguaggio c++. Comunque, è definita la classe

Codice:
class Example5 { string* ptr;
public:
Example5 (const string& str) : ptr(new string(str)) {} ;
~Example5 () {delete ptr;}
// copy constructor:
Example5 (const Example5& x) : ptr(new string(x.content())) {}
// access content:
const string& content() const {return *ptr;}
//copy assignment
Example5& operator= (const Example5& x) {
delete ptr; // delete currently pointed string
ptr = new string (x.content()); // allocate space for new string, and copy
return *this;
}
};


Soprattutto non capisco il ruolo di return *this: cioè non capisco perchè, se quello che vogliamo è solo modificare i datamembri di Example5, la funzione debba ritornare qualcosa. Ad esempio, se dichiariamo:

Codice:
Example5 class1;
Example5 class2;
class2=class1;


il codice class2=class1 equivale (credo) a class2.operator=(class1) e quindi non capisco il ruolo di return *this, che in questo caso dovrebbe essere equivalente a return class2 (se appunto l'operatore = viene chiamato da class2). A cosa verrebbe assegnato *this?
Dal
Junior Member
Junior Member
 
Messaggio: 43 di 127
Iscritto il: 13/07/2018, 17:47

Re: [C++] Operatore assegnazione di copia

Messaggioda Raptorista » 24/09/2019, 09:18

Questa è una buona domanda! La spiegazione è che restituire *this permette di scrivere codice come
Codice:
Example5 class1;
Example5 class2;
Example5 class3;

// modifica class1

class3 = class2 = class1;  // class3.operator=(class2.operator=(class1))


cioè, rende associativo l'operatore di assegnamento.
Questo è quello che il C++ fa di routine con i tipi standard, e quindi è buona pratica che anche le classi definite da te si comportino nello stesso modo.

La stessa regola vale per tutti gli operatori di assegnamento, come Example5& operator+=(const Example5&), anche se definiti con parametri diversi, come Example5& operator=(const std::string&).
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5332 di 9616
Iscritto il: 28/09/2008, 19:58


Torna a Informatica

Chi c’è in linea

Visitano il forum: utente__medio e 1 ospite