2010-05-07 16 views
134

Possibili duplicati:
Variables After the Colon in a Constructor
C++ constructor syntax question (noob)C++, cosa significa il colon dopo un costruttore?

Ho qualche codice C++ qui:

class demo 
{ 
private: 
    unsigned char len, *dat; 

public: 
    demo(unsigned char le = 5, unsigned char default) : len(le) 
    { 
     dat = new char[len];          
     for (int i = 0; i <= le; i++)        
      dat[i] = default; 
    } 

    void ~demo(void) 
    {            
     delete [] *dat;           
    } 
}; 

class newdemo : public demo 
{ 
private: 
    int *dat1; 

public: 
    newdemo(void) : demo(0, 0) 
    { 
    *dat1 = 0;             
    return 0;              
    } 
}; 

La mia domanda è, quali sono il : len(le) e : demo(0, 0) chiamano?

È qualcosa a che fare con l'ereditarietà?

+5

Duplicato di http://stackoverflow.com/questions/1272680/c-constructor-syntax-question-noob, http://stackoverflow.com/questions/2349978/variables-after-the-colon-in-a -constructor, http://stackoverflow.com/questions/2445330/importance-of-a-singlecolon-in-c, http://stackoverflow.com/questions/1632484/c-initialization-question – outis

+28

** NON CANCELLARE ** domande con buone risposte! [Jeff ha detto così!] (Http://meta.stackexchange.com/questions/50069/why-are-we-deleting-instead-of-merging/50106#50106) –

+0

@KonradRudolph Una di queste domande duplicate è stata cancellata, sfortunatamente: http://stackoverflow.com/questions/2445330/importance-of-a-singlecolon-in-c –

risposta

187

Come altri hanno già detto, è un elenco di inizializzazione. Si può usare per due cose:

  1. Calling costruttori della classe base di
  2. Inizializzazione variabili membro prima che il corpo del costruttore esegue.

Per il caso n. 1, presumo che comprendiate l'ereditarietà (se non è così, fatemelo sapere nei commenti). Quindi stai semplicemente chiamando il costruttore della tua classe base.

Per il caso n. 2, potrebbe essere posta la seguente domanda: "Perché non solo inizializzarlo nel corpo del costruttore?" L'importanza degli elenchi di inizializzazione è particolarmente evidente per i membri const. Per esempio, dare un'occhiata a questa situazione, dove voglio inizializzare m_val sulla base del parametro del costruttore:

class Demo 
{ 
    Demo(int& val) 
    { 
     m_val = val; 
    } 
private: 
    const int& m_val; 
}; 

dalle specifiche C++, questo è illegale. Non possiamo cambiare il valore di una variabile const nel costruttore, perché è contrassegnato come const. Così si può utilizzare l'elenco di inizializzazione:

class Demo 
{ 
    Demo(int& val) : m_val(val) 
    { 
    } 
private: 
    const int& m_val; 
}; 

Quella è l'unica volta che è possibile modificare una variabile membro const. E come Michael ha notato nella sezione commenti, è anche l'unico modo per inizializzare un riferimento che è un membro della classe.

Al di fuori del suo utilizzo per inizializzare le variabili membro const, sembra essere stato generalmente accettato come "il modo" di inizializzare le variabili, quindi è chiaro agli altri programmatori che leggono il codice.

+13

Per essere chiari - oltre a inizializzare i membri 'const', è l'unico modo per inizializzare i membri di riferimento, sia' const' che no (dal momento che un'assegnazione a un riferimento è un'assegnazione a ciò cui si riferisce il riferimento). –

+0

possiamo fare qualcosa di simile 'Demo(): m_val (NULL)' sto facendo questo, ma la sua mi dà errori, qualsiasi idea di cosa sto facendo male – 2am

+1

+1 utile :) –

6

Si chiama elenco di inizializzazione. Inizializza i membri prima dell'esecuzione del corpo del costruttore.

22

Questo è chiamato un elenco di inizializzazione. È per passare argomenti al costruttore di una classe genitore. Ecco un buon link che lo spiega: Initialization Lists in C++

6

Si chiama elenco di inizializzazione. Un elenco di inizializzazione è il modo in cui si passano argomenti ai costruttori delle variabili membro e per passare argomenti al costruttore della classe genitore.

Se si utilizza = da assegnare nel corpo del costruttore, prima viene chiamato il costruttore predefinito, quindi viene chiamato l'operatore di assegnazione. Questo è un po 'dispendioso, ea volte non esiste un operatore di assegnazione equivalente.

1

Si sta chiamando il costruttore della sua classe base, demo.

1

Significa che len non è impostato utilizzando il costruttore predefinito. mentre la classe demo viene costruita. Per esempio:

class Demo{ 
    int foo; 
public: 
    Demo(){ foo = 1;} 
}; 

dovrebbe prima mettere un valore in foo prima di impostarlo a 1. E 'un po' più veloce ed efficiente.