PDA

View Full Version : [C++] Ctor


riemann_01
06-06-2006, 10:40
Ciao!!
Per quale motivo un costruttore che utilizza una lista di inizializzatori e' piu' efficiente rispetto ad un altro, identico, che usa invece l'assegnamento?

class my_class {
public:
my_class(type i = default_value_i, type j = default_value_j) : a(i), b(j) {};
...
private:
type a, b;
};

class my_class {
public:
my_class(type i = default_value_i, type j = default_value_j) { a = i; b = j; }
...
private:
type a, b;
};

fek
06-06-2006, 14:41
Immagina di avere questa classe:



class A
{
public:

A()
{
// fai tante operazioni per inizializzare l'oggetto
}

A(A& a)
{
Copy(a);
}

A& operator=(A& a)
{
Copy(a);
return *this;
}

void Copy(a)
{
// inizializza l'oggetto e copia il contenuto di a
}
};


Ora due versioni della classe B che usa A


class B1
{

A a;

public:

B1(A& lhr): a(lhr)
{
}
};

class B2
{

A a;

public:

B2(A& lhr)
{
a = lhr;
}
};


Il costruttore della classe B1 produrra un codice di questo tipo:

a.ctor(lhr);

Il costruttore della classe B2 invece questo:

a.ctor();
a.operator=(lhr);

Nel secondo caso chiami il costruttore, inizializzi l'oggetto, poi chiami l'operatore di assegnamento che distrugge il contenuto appena inizializzato, e poi effettua la copia.

Ovviamente ci sono vari modi di migliorare la situazione nel secondo caso (magari un flag per capire se l'oggetto e' stato gia' inizializzato o meno), ma il modo piu' semplice e' usare gli strumenti che il C++ mette a disposizione: la lista di inizializzazione.

Nel caso di oggetti molti semplici come gli interi non cambia nulla, ma e' sembre comunque buona norma usare la lista di inizializzazione.

riemann_01
07-06-2006, 10:38
Grazie per la risposta.