studio programacion móviles entre diferencia desarrollo curso aplicaciones c++ class constructor initialization member

programacion - typedef struct c++



¿Por qué no podemos inicializar a los miembros de la clase en su declaración? (2)

Me pregunto si existe una razón por la cual no podamos inicializar a los miembros en su declaración.

class Foo { int Bar = 42; // this is invalid };

Como un equivalente de usar listas de inicialización de constructor.

class Foo { int Bar; public: Foo() : Bar(42) {} }

Mi comprensión personal es que el ejemplo anterior es mucho más expresivo e intencional. Además, esta es una sintaxis más corta. Y no veo ninguna posibilidad de confusión con otros elementos del lenguaje.

¿Hay alguna aclaración oficial sobre esto?


La inicialización de miembros no estáticos no pudo hacerse así antes de C ++ 11. Si compila con un compilador C ++ 11, debería aceptar felizmente el código que ha proporcionado.

Me imagino que la razón para no permitirlo en primer lugar es porque una declaración de miembro de datos no es una definición. No hay ningún objeto siendo presentado. Si tiene un miembro de datos como int x; , no se crea ningún objeto int hasta que realmente cree un objeto del tipo de la clase. Por lo tanto, un inicializador en este miembro sería engañoso. Solo durante la construcción se puede asignar un valor al miembro, que es precisamente para lo que son las listas de inicialización de miembros.

También hubo algunos problemas técnicos para solucionar antes de que se pudiera agregar la inicialización de miembros no estáticos. Considere los siguientes ejemplos:

struct S { int i(x); // ... static int x; }; struct T { int i(x); // ... typedef int x; };

Cuando estas estructuras se analizan, al momento de analizar el miembro i , es ambiguo si se trata de una declaración de miembro de datos (como en S ) o una declaración de función de miembro (como en T ).

Con la funcionalidad añadida, esto no es un problema porque no puede inicializar un miembro con esta sintaxis parantheses. Debe usar un inicializador de llaves o igual, como por ejemplo:

int i = x; int i{x};

Estos solo pueden ser miembros de datos, por lo que ya no tenemos ningún problema.

Consulte la propuesta N2628 para obtener una visión más detallada de los problemas que deben tenerse en cuenta al proponer inicializadores de miembros no estáticos.


La razón principal es que la inicialización se aplica a un objeto, o una instancia, y en la declaración en la clase no hay objeto o instancia; no tienes eso hasta que comiences a construir.

Ha habido una evolución en este sentido. Ya, al final de la estandarización de C ++ 98, el comité agregó la posibilidad de hacer esto para los miembros de la clase estática de tipo integral --- principalmente porque estos pueden ser usados ​​en contextos donde el compilador debe ser capaz de ver la inicialización . En C ++ 11, el lenguaje se ha ampliado para permitir especificar un inicializador en la declaración, pero esto es solo una abreviatura: la inicialización real todavía tiene lugar en la parte superior del constructor.