2010-11-12 5 views
28

Questo è qualcosa che mi sono chiesto da molto tempo. Prendiamo il seguente esempio:Come vengono gestiti i membri dell'array C++ nelle funzioni di controllo della copia?

struct matrix 
{ 
    float data[16]; 
}; 

So quello che il costruttore e distruttore di default fare in questo esempio specifico (niente), ma per quanto riguarda il costruttore di copia e l'operatore di assegnazione copia?

struct matrix 
{ 
    float data[16]; 

    // automatically generated copy constructor 
    matrix(const matrix& that) : // What happens here? 
    { 
     // (or here?) 
    } 

    // automatically generated copy assignment operator 
    matrix& operator=(const matrix& that) 
    { 
     // What happens here? 

     return *this; 
    } 
}; 

Ciò comporta std::copy o std::uninitialized_copy o memcpy o memmove o cosa?

+3

Questo non è proprio C, ma (principalmente) C++. –

+0

@DervinThunk Ho cambiato il titolo della domanda da C a C++ – jfritz42

risposta

37

Questo è ciò che lo standard dice in 12.8 (Copia oggetti classe). Copia costruzione:

Ogni subobject viene copiato in modo adeguato al tipo:

  • se subobject è di tipo classe, il costruttore di copia per la classe viene utilizzata;
  • se il sottooggetto è una matrice, ogni elemento viene copiato, nel modo appropriato al tipo di elemento;
  • se il sottooggetto è di tipo scalare, viene utilizzato l'operatore di assegnazione incorporato. assegnazione

Copy:

Ogni subobject è assegnato in modo adeguato al tipo:

  • se subobject è di tipo classe, l'operatore di assegnazione copia per la classe è usato (come se per qualificazione esplicita, cioè ignorando qualsiasi possibile funzione di override virtuale in più classi derivate);
  • se il sottooggetto è una matrice, ogni elemento è assegnato, nel modo appropriato al tipo di elemento;
  • se il sottooggetto è di tipo scalare, viene utilizzato l'operatore di assegnazione incorporato.