2016-02-22 5 views
63

Sagen wir eine Klasse alsWenn zwei Objekte in einer einzigen Zeile deklariert sind, in welcher Reihenfolge werden sie konstruiert?

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

und jetzt als

A a,b; 

In welcher Reihenfolge werden a und b erstellt Ich schaffe zwei Objekte definiert wurde? Ist es durch den Standard definiert?

+13

Das Komma in einer Erklärung nicht der Komma-Operator, es ist lediglich ein Separator. –

+2

Mögliches Duplikat von [Wie funktioniert der Komma-Operator] (http://stackoverflow.com/questions/54142/how-does-the-common-operator-work) – Zakkery

+13

In diesem Fall ist es nicht der Komma-Operator. – NathanOliver

Antwort

78

Von 8 Deklaratoren [dcl.decl] 3:

Jeder init-declarator in einer Erklärung wird getrennt analysiert, als ob sie von selbst in einer Erklärung war.

Es geht weiter zu sagen

Eine Erklärung mit mehreren Deklaratoren mit der entsprechenden Sequenz von Deklarationen in der Regel entspricht, jeweils mit einem einzigen declarator. Das heißt T D1, D2, ... Dn; in der Regel entspricht T D1; T D2; ... T Dn; wo T ist ein decl-Spezifizierer-seq und jede Di eine init-declarator. Eine Ausnahme tritt auf, wenn ein durch der Deklaratoren eingeführter Name einen von den decl-specifiers verwendeten Typnamen verbirgt, so dass, wenn die gleichen decl-specifiers in einer nachfolgenden Deklaration verwendet werden, sie nicht dieselbe Bedeutung haben.

Sie können sagen, dass sie von links nach rechts aufgebaut sind.

+8

Beat mich um 45 Sekunden :-) – Nemo

+0

@ erip..danke für die Antwort. Kann ich T D1, D2 = D1; oder nicht? – pasha

+2

@pasha 'T D1, D2 = D1;' wird 'T D1; T D2 = D1; 'nach den Regeln ja. – NathanOliver

8

wird zunächst eine erstellt und dann b.

Kommas in diesem Fall werden als Separatoren und nicht als Operatoren verwendet werden.

Zum Beispiel aus 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

Der Auftrag ist der schriftliche Auftrag, von links nach rechts. Es ist auch nicht der Komma-Operator, sondern einfach eine Liste von Deklaratoren. Wenn ein benutzerdefinierter Kommaoperator verwendet wird, ist die Reihenfolge tatsächlich nicht spezifiziert.

Siehe comma operator und declarators.

52

C++ spec Kapitel 8 [dcl.decl], sagen:

Jeder init-declarator in einer Erklärung als separat analysiert wird, wenn es in einer Erklärung wurde von selbst.(100)

Fußnote (100) geht weiter zu sagen:

(100) ist eine Erklärung mit mehreren Deklaratoren ist in der Regel gleichbedeutend mit der entsprechenden Sequenz von Erklärungen mit jeweils einem einzigen declarator. Das ist

T D1, D2, ... Dn; 

in der Regel zu

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

... gleichwertig ist, und dann nennt einige Ausnahmen, von denen keines in einer solchen einfachen Fällen anzuwenden.

Also die Antwort auf Ihre Frage ist, dass die Objekte in der Reihenfolge erstellt werden, in der Sie sie auflisten. Und nein, es ist kein Komma-Operator.

+7

Wie verstehen Sie "normalerweise" in diesem Zusammenhang? – SergeyA

+8

@SergeyA Durch das Lesen der Ausnahmen wird in diesem Fall "normalerweise" zu "nein", dann wird das Komplement für die Bestätigung genommen. :) – erip

+4

@erip, ziemlich ein Prozess :) – SergeyA

6

Standards:

Deklaratoren [dcl.decl]:
Jeder init-declarator in einer Erklärung wird separat analysiert, als ob sie von selbst in einer Erklärung war.

Beispiel:

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"); 
} 

Output:

I am a 
I am b 
+3

Dieser Code ist nicht wirklich ein Beweis dafür, dass dies wahr ist. Das Standardangebot ist. – erip

Verwandte Themen