2015-04-17 10 views
9

Mi sto cacciando con C++ e c'è una funzione linguistica che ho problemi particolari a farmi girare la testa.Variabili costruite in modo implicito in C++

Sono abituato a dichiarare e inizializzare una variabile in modo esplicito, ma in C++ a volte sembriamo dichiarare e costruire implicitamente una variabile.

Ad esempio in questo snippet rdev sembra essere costruito implicitamente (come viene successivamente utilizzato per costruire un default_random_engine);

random_device rdev; 
default_random_engine gen(rdev()); 

Qualcuno può spiegare cosa sta succedendo qui? Come posso distinguerlo da una semplice dichiarazione come int myInt;?

+0

Tutte ottime risposte, grazie. Ho accettato la risposta di @ Puppy in quanto ha spiegato perché int è leggermente diverso usando belle parole facili;), ma anche i dettagli tecnici nelle altre risposte sono molto utili. – Giswok

risposta

4

Qualcuno può spiegare cosa sta succedendo qui? Come posso distinguere questo da una semplice dichiarazione come int myInt;

Sono entrambe definizioni semplici.

L'unica differenza sono le proprietà del tipo. random_device deve essere costruito, così è. int ma la gente ha pianto troppo, quindi non lo è. Francamente, il comportamento di int è più un difetto di linguaggio che qualcosa che in realtà desideri.

In definitiva, questa è una proprietà dei tipi e non le definizioni.

5

Qualcuno può spiegare cosa sta succedendo qui?

Queste sono definizioni, non solo dichiarazioni. Una definizione di variabile crea la variabile. Nel primo caso, non c'è alcun inizializzatore, che indica che dovrebbe essere inizializzato di default.

Come distinguere questo da una semplice dichiarazione come int myInt;?

Questa è anche una definizione, creando la variabile int e lasciandola non inizializzata.

è possibile dichiarare una variabile globale senza definirlo:

extern int myInt; 

extern indica che ha collegamento esterno, ed è definito da qualche altra parte. Non è possibile dichiarare altri tipi di variabile senza definirli.

+0

Sono contati come definizioni? In realtà non si definisce nulla, si dichiara semplicemente la variabile e viene dato un po 'di memoria. –

+0

@ JID: Sì, queste sono definizioni, che definiscono le variabili. È la definizione che determina l'allocazione dello spazio di archiviazione e l'inizializzazione della variabile. –

+0

sì, ho appena cercato e hai ragione :) –

5
random_device rdev; // creates an instance of random_device on the stack 
        // with default constructor (taking no arguments) 

default_random_engine gen( // creates an instance of default_random_engine 
          // on the stack 
    rdev()     // passing it the result of 
          // invocation of operator '()' 
          // on the instance rdev of random_device 
); 

Stesso in una forma più dettagliata (con un po 'C++ 11):

auto rdev = random_device {}; 
auto gen = default_random_engine { rdev.operator()() }; 
3

Come indicato in standard C++ (8.5.11): If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [ Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note ]

Questo è esattamente il vostro caso: una definizione variabile senza inizializzatore esplicito. Quindi, vediamo cosa default-initialized mezzi (8.5.7):

To default-initialize an object of type T means: 
    — if T is a (possibly cv-qualified) class type (Clause 9), 
    the default constructor for T is called 
    (and the initialization is ill-formed if T has no accessible default constructor); 
— if T is an array type, each element is default-initialized; 
— otherwise, no initialization is performed. 

Questo afferma chiaramente la differenza tra le due esempi:

  • random_device è un tipo di classe, per cui il suo costruttore di default (quello senza argomenti) è implicitamente chiamato.
  • int non è né un tipo di classe né un tipo di matrice, quindi non viene eseguita alcuna inizializzazione e avrà un valore indeterminato finché non viene inizializzato in modo esplicito (assegnando un valore ad esso).
Problemi correlati