Tengo una clase
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
¿Dónde está el mejor lugar para inicializar la cadena s
en el archivo fuente?
c++
static
initialization
constants
Thomas
fuente
fuente
i
debe definirse en el cpp. §9.4.2 / 4 Si un miembro de datos estáticos es de tipo const integral o de enumeración const, su declaración en la definición de clase puede especificar un inicializador constante que será una expresión constante integral (5.19). En ese caso, el miembro puede aparecer en expresiones constantes integrales. El miembro aún se definirá en un ámbito de espacio de nombres si se usa en el programa y la definición del ámbito de espacio de nombres no contendrá un inicializador.i
que tendría que definirse solo si se usara en otro lugar que no sea en expresiones constantes integrales, ¿verdad? En este caso, no puede decir que hay un error porque no hay suficiente contexto para estar seguro, o hablando estrictamente, el ejemplo anterior es correcto si no hay otro código. Ahora aprecio tu comentario (+1), ¡todavía estoy aprendiendo cosas! Así que intentaré aclarar ese punto en la respuesta, por favor avíseme si es mejor ...int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
cuenta que C ++ 11 permite llamar a las funciones 'constexpr':constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Los miembros estáticos deben inicializarse en una unidad de traducción .cpp en el ámbito del archivo o en el espacio de nombres apropiado:
fuente
En una unidad de traducción dentro del mismo espacio de nombres, generalmente en la parte superior:
fuente
Desde C ++ 17, el especificador en línea también se aplica a las variables. Ahora puede definir variables miembro estáticas en la definición de clase:
fuente
Solo los valores integrales (por ejemplo,
static const int ARRAYSIZE
) se inicializan en el archivo de encabezado porque generalmente se usan en el encabezado de clase para definir algo como el tamaño de una matriz. Los valores no integrales se inicializan en el archivo de implementación.fuente