resueltos programacion polimorfismo orientada objetos metodos herencia ejercicios ejemplos codigo clases c++ language-lawyer declaration object-construction

c++ - programacion - Si se declaran dos objetos en una sola línea, ¿en qué orden se construyen?



polimorfismo en c++ (5)

Digamos que una clase se ha definido como

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

y ahora estoy creando dos objetos como

A a,b;

¿En qué orden se crean a y b ? ¿Está definido por el estándar?


De 8 declaradores [dcl.decl] 3:

Cada declarador de inicio en una declaración se analiza por separado como si estuviera en una declaración por sí mismo.

Continúa diciendo

Una declaración con varios declaradores suele ser equivalente a la secuencia correspondiente de declaraciones, cada una con un solo declarador. Eso es T D1, D2, ... Dn; suele ser equivalente a T D1; T D2; ... T Dn; T D1; T D2; ... T Dn; donde T es un decl-specifier-seq y cada Di es un init-declarator. Se produce una excepción cuando un nombre introducido por uno de los declaradores oculta un nombre de tipo utilizado por los especificadores de declinación, de modo que cuando se utilizan los mismos especificadores de declinación en una declaración posterior, no tienen el mismo significado.

Se puede decir que se construyen de izquierda a derecha.


El capítulo 8 de especificaciones de C ++ [dcl.decl] dice:

Cada declarador de inicio en una declaración se analiza por separado como si estuviera en una declaración por sí mismo. (100)

La nota al pie (100) continúa diciendo:

(100) Una declaración con varios declaradores suele ser equivalente a la secuencia correspondiente de declaraciones, cada una con un único declarante. Es decir

T D1, D2, ... Dn;

suele ser equivalente a

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

... y luego nombra algunas excepciones, ninguna de las cuales se aplica en casos tan simples.

Entonces, la respuesta a su pregunta es que los objetos se construyen en el orden en que los enumera. Y no, no es un operador de coma.


El orden es el orden escrito, de izquierda a derecha. Además, no es el operador de coma, sino simplemente una lista de declaradores. Cuando se utiliza un operador de coma definido por el usuario, el orden no está especificado.

Ver operador de coma y declarators .


Normas:

Declaradores [dcl.decl]:
Cada declarador de inicio en una declaración se analiza por separado como si estuviera en una declaración por sí mismo.

Ejemplo:

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

Salida:

I am a I am b


a se creará primero y luego b .

Las comas en este caso se utilizarán como separadores y no como operadores.

Por ejemplo de 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;