2016-02-22 8 views
63

Diciamo che una classe è stata definita comeSe due oggetti sono dichiarati in una singola riga, in quale ordine vengono costruiti?

class A { 
//..... 
}; 

e ora sto creando due oggetti come

A a,b; 

In che ordine sono a e b creato? È definito dallo standard?

+13

La virgola in una dichiarazione non è l'operatore virgola, è semplicemente un separatore. –

+2

Possibile duplicato di [Come funziona l'Operatore di Comma] (http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) – Zakkery

+13

In questo caso non è l'operatore virgola. – NathanOliver

risposta

78

Da 8 Dichiaratori [dcl.decl] 3:

Ogni init-dichiaratore in una dichiarazione viene analizzato separatamente come se fosse in una dichiarazione di per sé.

Va a dire

Una dichiarazione con diversi dichiaratori solito è equivalente alla corrispondente sequenza di dichiarazioni ciascuno con un singolo declarator. Cioè T D1, D2, ... Dn; è solitamente pari a T D1; T D2; ... T Dn; dove T è un decl-specificatore-seq e ciascuno Di è un init-declarator. Un'eccezione si verifica quando un nome introdotto da uno dei i dichiaratori nasconde un nome di tipo usato dagli specificatori decl, in modo che quando gli stessi decl-specificatori vengono utilizzati in una successiva dichiarazione , non hanno lo stesso significato.

Si può dire che sono costruiti da sinistra a destra.

+8

Beat me di 45 secondi :-) – Nemo

+0

@ erip..grazie per la risposta. Posso fare T D1, D2 = D1; o no? – pasha

+2

@pasha 'T D1, D2 = D1;' diventa 'T D1; T D2 = D1; 'secondo le regole quindi sì. – NathanOliver

8

a verrà creato prima e quindi b.

Le virgole in questo caso verranno utilizzate come separatori e non come operatori.

Ad esempio da wikipedia:

/** 
     * Commas act as separators in this line, not as an operator. 
     * Results: a=1, b=2, c=3, i=0 
     */ 
    int a=1, b=2, c=3, i=0; 
11

L'ordine è l'ordine scritto, da sinistra a destra. Inoltre, non è l'operatore virgola, ma semplicemente un elenco di dichiaratori. Quando viene utilizzato un operatore virgola definito dall'utente, l'ordine è in realtà non specificato.

Vedere comma operator e declarators.

52

C++ spec capitolo 8 [dcl.decl], afferma:

Ogni init-dichiaratore in una dichiarazione viene analizzata separatamente come se era in una dichiarazione di per sé.(100)

nota (100) continua a dire:

(100) Una dichiarazione con diversi dichiaratori è generalmente equivalente al corrispondente sequenza di dichiarazioni ciascuno con un singolo declarator. Questo è

T D1, D2, ... Dn; 

è di solito equivale a

T D1; T D2; ... T Dn; 

... e poi i nomi di alcune eccezioni, nessuno dei quali si applicano in questi casi semplici.

Quindi la risposta alla tua domanda è che gli oggetti sono costruiti nell'ordine in cui li elenchi. E no, non è un operatore virgola.

+7

Come si capisce "di solito" in questo contesto? – SergeyA

+8

@SergeyA Leggendo le eccezioni nel qual caso "di solito" diventa "no", quindi prendendo il complemento per l'affermativo. :) – erip

+4

@erip, piuttosto un processo :) – SergeyA

6

Standard:

Dichiaratori [dcl.decl]:
Ogni init-dichiaratore in una dichiarazione viene analizzato separatamente come se fosse in una dichiarazione di per sé.

Esempio:

class A { 
public: 
    A(std::string const &s): name(s) 
    { 
     std::cout << "I am " << name << '\n'; 
    } 
    std::string name; 
}; 

auto main() -> int 
{ 
    A a("a"), b("b"); 
} 

uscita:

I am a 
I am b 
+3

Questo codice non è davvero una prova che questo è vero. La citazione standard è. – erip

Problemi correlati