= è un operatore binario...cioè per fare un operazione utilizzando tale operatore bisogna avere due elementi...
si può overlodare un operatore in 2 modi:tramite un metodo della classe a cui si riferisce o tramite funzione friend
nel primo caso avrai:
#include <iostream>
using namespace std;
class Persona{
public:
Persona(char*,char*,char,int);
~Persona(){}
Persona(const Persona&); //costruttore di copia
Persona operator=(Persona persona2); //operatore di assegnazione
void Print();
void setNome(char*);
void setCognome(char*);
void setSex(char);
void setEta(int);
private:
char *nome, *cognome, sex;
int eta;
};
dove lo sviluppo sarà:
Persona Persona::operator=(Persona persona2){
nome=persona2.nome;
cognome=persona2.cognome;
sex=persona2.sex;
eta=persona2.eta;
return *this;
}
nel secondo caso:
#include <iostream>
using namespace std;
class Persona{
public:
Persona(char*,char*,char,int);
~Persona(){}
Persona(const Persona&); //costruttore di copia
friend void operator=(Persona *persona1,Persona persona2); //operatore di assegnazione
void Print();
void setNome(char*);
void setCognome(char*);
void setSex(char);
void setEta(int);
private:
char *nome, *cognome, sex;
int eta;
};
dove lo sviluppo sarà:
void operator=(Persona *persona1,Persona persona2){
persona1.nome=persona2.nome;
persona1.cognome=persona2.cognome;
persona1.sex=persona2.sex;
persona1.eta=persona2.eta;
}
PS:il costruttore di copia non ti serve a nulla in questo caso...infatti i costruttori di copia sono necessari se effettui allocazione di memoria all'interno di un oggetto. In questo caso, non puoi semplicemente limitarti a copiare il puntatore (come fa il costruttore di copia di default), ma hai davvero bisogno all'atto della copia di allocare una parte della memoria, in modo che i valori associati ai due oggetti possano essere differenti. Quindi i costruttori di copia risolvono il problema della condivisione di memoria indesiderata che si avrebbe all'atto dell'assegnamento di un oggetto con parti dinamiche (cioè con membri puntatori).
Ad esempio in un programma del genere:
class Vector
{
int n;
float *v;
public:
Vector();
Vector (const Vector &);
};
Vector::Vector()
{
v = new float[100];
n = 100;
}
Vector::Vector (const Vector &vector)
{
n = vector.n; // Copia del campo n
v = new float[100]; // Crea un nuovo array
for (int i = 0; i < 100; i++)
v[i] = vector.v[i]; // Copia l'array
}