2015-03-19 6 views
6

Quando ho letto il costruttore di copie e il costruttore di assegnazioni di copie, ciò che ottengo è che entrambi trasmettono le loro proprietà l'una all'altra. E, entrambi sono dichiarati implicitamente dal compilatore (se non definito). Quindi, entrambi devono esistere, sia che facciano qualcosa di utile o no.Quando è stato chiamato l'operatore di assegnazione copia?

Poi ho provato questo codice:

#include <iostream> 

using namespace std; 

class Test { 
public: 
    Test() { 
     cout << "Default constructor" << endl; 
    } 

    Test (const Test& empty) { 
     cout << "Copy constructor" << endl; 
    } 

    Test& operator=(const Test& empty) { 
     cout << "Copy assignment operator" << endl; 
    } 
private: 

}; 

int main() { 
    Test a;  // Test default constructor 
    Test b (a); // Test copy constructor 
    Test c = b; // Test copy assignment constructor 
    system ("pause"); 
    return 0; 
} 

ma sembra l'operatore di assegnazione di copia non si chiama affatto. Ho provato con tre condizioni:

  1. Tutto incluso. Stampa:

    // Default constructor 
    // Copy constructor 
    // Copy constructor # Why not prints out "Copy assignment operator"? 
    
  2. Se l'operatore di assegnazione copia non esegue la copia del costruttore. Stampa:

    // Default constructor 
    // Copy constructor 
    // Copy constructor # Why it's printed out even though I didn't define it? 
    
  3. Se non è possibile copiare il costruttore di copia, basta copiare l'operatore di assegnazione. Stampa:

    // Default constructor # Why "Copy assignment operator" is not printed out? 
    
  4. Unico costruttore. Esso stampa:

    // Default constructor # Understandable 
    

Quindi, è come il compilatore non importava neanche se io definisco l'operatore di assegnamento per copia o meno. Nessuno dei quattro esempi sopra mostra "Copy assignment operator". E quindi, quando ha chiamato se esiste davvero e ha un significato?

+2

'c' è un nuovo oggetto quindi è copy constrcut – billz

risposta

12

Test c = b è un inizializzazione, non un compito.

Se avessi fatto questo:

Test c; 
c = b; 

Poi avrebbe chiamato l'operatore di assegnazione di copia.

+0

Ciò significa che' Test c (b) 'e' Test c = b' sono identici? –

+5

@ AndreasVennström No, non sono identici. Entrambi hanno lo stesso effetto in questo codice, ma sono due diversi tipi di inizializzazione. Vedi http://bit.ly/1FLauIT e leggi sull'inizializzazione diretta e di copia. – 0x499602D2