2012-09-27 7 views
5

Analogamente, il costruttore di copie predefinito chiama il costruttore di copia su tutti i membri? Ad esempio, se una classe ha un membro non-POD in questo modo:L'operatore di assegnazione predefinito chiama l'operatore = su tutti i membri?

class A 
{ 
    std::string str; 
}; 

... sarà il costruttore di copia di default generato dal compilatore e incarico di lavoro dell'operatore in modo corretto? Chiameranno il costruttore di copia della stringa e operator= o faranno solo una copia bit per bit della variabile membro str?

In altre parole, con un membro std::string significa che questa classe ha bisogno di un costruttore di copia e un operatore di assegnazione implementati dall'utente?

risposta

5

Sì, lo schema generato dal compilatore funzionerà correttamente.

Tuttavia, se si implementa il proprio e li lascia vuoto, non lo farà.

Se non si gestisce la memoria e tutti i membri forniscono copia/assegnazione/distruzione corrette, non è necessario (e non dovrebbe) implementare il proprio gestore copia/distruttore/assegnazione.

In altre parole, con un membro std :: string questa classe ha bisogno di un costruttore di copia e un operatore di assegnazione implementati dall'utente?

No, quelli generati dal compilatore funzioneranno perfettamente.

+0

"Sì, lo schema generato dal compilatore funzionerà correttamente." - anche per le classi con membri const? –

+0

@spin_eight bene allora una copia o un compito non sarebbero nemmeno compilati. –

+3

@LuchianGrigore: in realtà, una copia verrà compilata. Il compito non sarà ovviamente. –