2016-02-22 73 views
63

Powiedzmy klasa została zdefiniowana jakoJeśli dwa obiekty są zadeklarowane w jednym wierszu, w jakiej kolejności są konstruowane?

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

i teraz tworzę dwa obiekty jako

A a,b; 

w jakiej kolejności są a i b stworzył? Czy jest to określone przez normę?

+13

Przecinek w zgłoszeniu nie przecinek operator, to tylko separatora. –

+2

Możliwy duplikat [Jak działa przecinek Operator] (http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) – Zakkery

+13

W tym przypadku nie jest to operator przecinka. – NathanOliver

Odpowiedz

78

od 8 Declarators [dcl.decl] 3:

Każdy startowe declarator w zgłoszeniu analizowano osobno, jak gdyby była w zgłoszeniu sama.

ona następnie znaczy

Zgłoszenie kilka declarators wynosi zwykle odpowiednią sekwencją zgłoszeń każdy z pojedynczym declarator. Oznacza to T D1, D2, ... Dn; wynosi zwykle T D1; T D2; ... T Dn; gdzie T jest decl-specyfikator-SEQ oraz każdy Di jest startowe declarator. Wyjątek występuje wtedy, gdy nazwa wprowadzona przez jeden z deklaratorów ukrywa nazwę typu używaną przez specyfikatory dekl, tak, że gdy te same specyfikatory dekl są używane w późniejszej deklaracji , nie mają one tego samego znaczenia.

Można powiedzieć, że są zbudowane od lewej do prawej.

+8

Pokonaj mnie przez 45 sekund :-) – Nemo

+0

@ erip..dzięki za odpowiedź. Czy mogę wykonać T D1, D2 = D1; albo nie? – pasha

+2

@ pasza 'T D1, D2 = D1;' staje się 'T D1; T D2 = D1; 'według zasad tak, tak. – NathanOliver

8

Najpierw zostanie utworzone, a następnie b.

Przecinki w tym przypadku będą używane jako separatory, a nie jako operatory.

Na przykład z wikipedii:

/** 
     * 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

Kolejność jest pisemne zlecenie, od lewej do prawej. Ponadto nie jest to operator przecinka, ale po prostu lista deklaratorów. Kiedy używany jest operator definiowany przez użytkownika, zamówienie jest w rzeczywistości nieokreślone.

Zobacz comma operator i declarators.

52

C++ Spec rozdział 8 [dcl.decl] mówi:

Każdy startowe declarator w zgłoszeniu analizowano osobno, jak gdyby była w zgłoszenia sama.(100)

Przypis (100) przechodzi dalej:

(100) Zgłoszenie kilka declarators wynosi zwykle odpowiadającej sekwencji zgłoszeń każdy z pojedynczym declarator . To

T D1, D2, ... Dn; 

jest zwykle równoważne

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

... a potem nazwy pewnymi wyjątkami, z których żadna nie stosuje się w takich prostych przypadkach.

Więc odpowiedź na twoje pytanie jest taka, że ​​obiekty są konstruowane w kolejności, w jakiej je masz. I nie, to nie jest operator przecinka.

+7

Jak rozumiesz "zwykle" w tym kontekście? – SergeyA

+8

@SergeyA Odczytując wyjątki, w których przypadku "zwykle" staje się "nie", a następnie przyjmowanie dopełnienia twierdzącego. :) – erip

+4

@erip, całkiem proces :) – SergeyA

6

Standardy:

Declarators [dcl.decl]
Każdy startowe declarator w zgłoszeniu analizowano osobno, jak gdyby była w zgłoszeniu sama.

przykład:

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

wyjściowa:

I am a 
I am b 
+3

Ten kod nie jest tak naprawdę dowodem, że to prawda. Standardowy cytat to. – erip