Questo non utilizza l'operatore di assegnazione (le due linee sono equivalenti, per quanto ne so). =
viene utilizzato nella sintassi, ma operator=
non viene effettivamente utilizzato:
myClass myVariable = myClass(123);
//or
myClass myVariable(123);
Questo si usa l'operatore di assegnazione:
myClass myVariable;
myVariable = myClass(123);
Se operatore di assegnazione è male o non implementato, prime opere dichiarazione, secondo può (e molto probabilmente) crash.
#include <iostream>
#include <string.h>
using namespace std;
class Dvector
{
public:
Dvector(int thesize = 0)
{
std::cout << "Constructing object of size " << thesize << std::endl;
size = thesize;
data = new double[size];
}
Dvector(const Dvector& v)
{
std::cout << "Constructing object of size " << v.size << " by copy" << std::endl;
size = v.size;
data = new double[size];
memcpy(data, v.data, sizeof(double)*size);
}
Dvector& operator=(const Dvector& v)
{
std::cout << "Assigning object of size " << v.size << std::endl;
if (&v != this)
{
size = v.size;
data = new double[size];
memcpy(data, v.data, sizeof(double)*size);
}
return *this;
}
~Dvector()
{
std::cout << "Destroying object" << std::endl;
delete [] data;
}
private:
double* data;
int size;
};
int main() {
Dvector v = Dvector(3);
return 0;
}
Displays:
Constructing object of size 3
Destroying object
Quando:
int main() {
Dvector v;
v = Dvector(3);
return 0;
}
Displays:
Constructing object of size 0
Constructing object of size 3
Assigning object of size 3
Destroying object
Destroying object
E si sarebbe schiantato se costruttore di copia non è stato definito ... perché poi v.data
finisce per puntare a data
allocati da variabili temporanee (Dvector(3)
) e quindi cancellati. Possibile arresto anomalo durante il tentativo di accedere a v.data
o alla distruzione v
(eliminazione della memoria già liberata).
Nessuna differenza una volta compilata. –