2013-03-28 24 views
14

Consideriamo le seguenti classiConstructor inizializzazione Vs assegnazione

class test1 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test1():a(0),b(0){} 
}; 

class test2 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test2() 
     { 
      a=0; 
      b=0; 
     } 
}; 

Ora, so che test1() constructor è il modo giusto per inizializzare i dati membri di una class, perché in test2() stiamo eseguendo l'assegnazione e non inizializzazione. Le mie domande sono:

  1. Cosa potrebbe andare storto se eseguiamo l'assegnazione anziché l'inizializzazione?
  2. Il compilatore non esegue internamente il compito in caso di costruttore test1()? Se no, come sono inizializzati?
+5

Vedere http://www.parashift.com/c++-faq/init-lists.html – hmjd

+0

vedere questa risposta ... http://stackoverflow.com/questions/13894415/c-creating-objects-initialization- liste-vs-assegnazione – Caribou

risposta

14

Cosa potrebbe andare storto se eseguiamo l'assegnazione anziché l'inizializzazione?

Alcuni tipi di classe (e anche riferimenti e oggetti const) non possono essere assegnati; alcuni non possono essere inizializzati di default; alcuni potrebbero essere più costosi di default, inizializzare e riassegnare piuttosto che inizializzarsi direttamente.

Il compilatore non esegue internamente l'assegnazione nel caso di costruttore test1()? Se no, come sono inizializzati?

Nel caso di tipi primitivi come int, c'è poca o nessuna differenza pratica tra i due. L'inizializzazione di default non fa nulla, e l'inizializzazione diretta e l'assegnazione fanno essenzialmente la stessa cosa.

In caso di tipi di classe, l'inizializzazione di default, l'assegnazione e l'inizializzazione diretta chiamano ciascuna diverse funzioni definite dall'utente, e alcune operazioni potrebbero non esistere affatto; quindi in generale i due esempi potrebbero avere un comportamento molto diverso.

9

Per il tuo esempio non c'è una vera differenza perché stai iniziando gli interi semplici.

Ma assumono questi numeri interi sono oggetti con i costruttori, allora il compilatore genera il seguente chiamate:

// test1 
a::copy_constructor(0); 
b::copy_constructor(0); 


// test2 
a::default_constructor(); 
b::default_constructor(); 
a::operator = (0); 
b::operator = (0); 

Quindi, a seconda vostri oggetti test2 potrebbe avere un enorme impatto sulle prestazioni. Inoltre, inizializzando gli oggetti negli elenchi di inizializzazione, garantisce che le variabili abbiano i dati quando si accede al costruttore. Uno "svantaggio" dell'elenco di inizializzazione è che viene eseguito nell'ordine in cui le variabili sono dichiarate e non nell'ordine dell'elenco di inizializzazione, quindi potrebbe essere che non si desidera utilizzare l'elenco di inizializzazione.

Problemi correlati