2012-03-21 7 views
6

sto facendo il seguente test:Perché c'è una copia prima dell'assegnazione?

#include <iostream> 
#include <vector> 

using namespace std; 
class A 
{ 
private: 
    int i; 
public: 
    A():i(1){cout<<"A constr"<<endl;} 
    A(const A & a):i(a.i){cout<<"A copy"<<endl;} 
    virtual ~A(){cout<<"destruct A"<<endl;} 
    void operator=(const A a){cout<<"A assign"<<endl;} 
}; 


int main() 
{ 
    A o1; 
    A o2; 
    o2=o1; 
} 

e l'uscita è:

A constr 
A constr 
A copy 
A assign 
destruct A 
destruct A 
destruct A 

Sembra che "o2 = o1" ha fatto una copia prima seguita da un incarico, e mi chiedo qual è il storia dietro di esso. Grazie!

risposta

15

Perché si passa da valore al tuo operatore di assegnazione:

void operator=(const A a) 

Probabilmente significava passare per riferimento e si dovrebbe anche restituire un riferimento al assegnata-di opporsi:

A& operator=(const A& a) { std::cout << "A assign" << std::endl; return *this; } 
4

È sembra impostare l'operatore di assegnazione da implementare correttamente:

T& T::operator= (T value) { 
    value. swap(*this); 
    return *this; 
} 

rgument è passato per copia all'operatore dell'assigment e il compilatore in realtà aveva bisogno di fare questa copia nella tua configurazione. Se si aveva passato una temporanea la copia avrebbe potuto essere evitato:

o2 = A(); 

Così, l'attuazione di cui sopra in realtà ha alcune interessanti proprietà: funzioni

  • sfrutta già scritto: il costruttore di copia è o generati o scritto ma fa la cosa giusta e se vuoi avere un incarico probabilmente vorresti avere il membro swap() e
  • il compito è una forte eccezione sicura se l'operazione swap() non è lanciata come dovrebbe essere. Quando ripartitori entrano l'immagine le cose devono essere fatte un po 'diverso, però
  • l'assegnazione cerca di evitare le operazioni di copia attuale e la copia durante il passaggio degli argomenti può essere tralasciata, in alcuni casi, vale a dire il contenuto è solo swap() ed in posizione
Problemi correlati