usar una son qué programacion objetos miembros metodos los funcion estáticos estaticos estatico estatica ejemplos definicion cuando clase atributos atributo c++ static static-members local-class

c++ - una - qué son los atributos de clase estáticos



¿Por qué no se permiten miembros de datos estáticos en las clases locales? (4)

A medida que las cosas progresan, ahora tenemos C ++ 11 y con eso puede definir constantes integrales de miembros variables en sus clases.

class test { public: const int FOO = 123; [...snip...] };

Eso funciona cuando compilas con C ++ 11. Tenga en cuenta que la palabra clave static no se utiliza. Al compilar con las optimizaciones activadas, es probable que todas esas variables se optimicen. Sin embargo, en la depuración, aparecen en su estructura como miembros variables regulares.

Sin embargo, tenga en cuenta que el tamaño de la clase / estructura aún incluirá esa variable. Así que aquí es probable 4 bytes para la variable FOO.

Sin embargo, en la mayoría de los casos, las clases definidas en una función se optimizarán completamente, por lo que es una excelente manera de hacer las cosas (¡un buen 50% de mis clases tienen miembros tan variables!)

¿Cuál es el razonamiento de por qué static const miembros de static const no pueden existir en clases locales? Parece una restricción bastante tonta.

Ejemplo:

void foo() { struct bar { int baz() { return 0; } // allowed static const int qux = 0; // not allowed?!? }; } struct non_local_bar { int baz() { return 0; } // allowed static const int qux = 0; // allowed };

Cita de la norma (9.8.4):

Una clase local no tendrá miembros de datos estáticos.


De la sección estándar 9.4.2:

Si un miembro de datos estáticos es de tipo de enumeración constante o constante, su declaración en la definición de clase puede especificar un inicializador de constantes que será una expresión constante constante. En ese caso, el miembro puede aparecer en expresiones constantes integrales dentro de su alcance. El miembro aún se definirá en un ámbito de espacio de nombres si se utiliza en el programa y la definición de ámbito de espacio de nombres no contendrá un inicializador.

Básicamente, las clases locales no tienen vínculos, y los miembros de datos estáticos requieren un vínculo.

Ya que no hay manera de definir un miembro de datos estáticos de una clase local en el ámbito del espacio de nombres (una declaración con un inicializador no es una definición), no se permiten, sean de tipo integral constante o no. En la superficie, puede parecer que el compilador debería poder alinear el valor, pero ¿qué sucede si intenta acceder a un puntero al miembro? Con las clases con ámbito de espacio de nombres solo obtendría un error de vinculador, pero las clases locales no tienen vinculación.

Supongo que, en teoría, podrían permitirle usar tipos constantes estáticos en clases locales siempre y cuando solo se usen en expresiones constantes integrales, pero probablemente solo supondría una carga demasiado grande para el cuerpo de estándares y los proveedores de compiladores para diferenciarlos. por muy poco valor práctico; las variables estáticas locales son accesibles desde las clases locales, por lo que usar una constante estática local debería ser igual de bueno.


Los miembros estáticos de una clase deben definirse en el ámbito global, por ejemplo,

abc.h class myClass { static int number; }; abc.cpp int myClass::number = 314;

Ahora, dado que el alcance dentro de void abc (int x) no es global, no hay alcance para definir el miembro estático.


No creo que haya una razón. Los miembros de datos estáticos normales no están permitidos porque no hay forma de definirlos después de ser declarados.

Además, no olvide que puede crear una variable const local fuera de la clase. Que puede usar dentro de la clase siempre y cuando solo lea su valor (es decir, mientras no tome la dirección.tit.its.its).