[C++] Operatore assegnazione di copia
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
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:
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?
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:
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?
Risposte
Questa è una buona domanda! La spiegazione è che restituire [inline]*this[/inline] permette di scrivere codice come
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 [inline]Example5& operator+=(const Example5&)[/inline], anche se definiti con parametri diversi, come [inline]Example5& operator=(const std::string&)[/inline].
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 [inline]Example5& operator+=(const Example5&)[/inline], anche se definiti con parametri diversi, come [inline]Example5& operator=(const std::string&)[/inline].