#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
Cuando intento inicializar la variable miembro const t
con 100. Pero me da el siguiente error:
test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static
¿Cómo puedo inicializar un const
valor?
Respuestas:
La
const
variable especifica si una variable es modificable o no. El valor constante asignado se utilizará cada vez que se haga referencia a la variable. El valor asignado no se puede modificar durante la ejecución del programa.La explicación de Bjarne Stroustrup lo resume brevemente:
Una
const
variable debe declararse dentro de la clase, pero no puede definirse en ella. Necesitamos definir la variable const fuera de la clase.Aquí la asignación
t = 100
ocurre en la lista de inicializadores, mucho antes de que ocurra la inicialización de la clase.fuente
Here the i = 10 assignment in initializer list happens much before the class initilizaiton occurs.
no entendí? Y básicamente ese tipo de definición de permisos dentro de la clase es específico del compilador, ¿verdad?operator = function not found
en VC ++. ¿Cual puede ser el problema?Bueno, podrías hacerlo
static
:o puede usar un inicializador de miembros:
fuente
const member
debería ser accesible desde las funciones / objetos, entonces ¿por qué estático?Hay un par de formas de inicializar los miembros const dentro de la clase.
Definición de miembro const en general, también necesita inicialización de la variable.
1) Dentro de la clase, si desea inicializar la constante, la sintaxis es así
2) La segunda forma puede ser
3) Bueno, si no desea inicializar en la declaración, la otra forma es a través del constructor, la variable debe inicializarse en la lista de inicialización (no en el cuerpo del constructor). Tiene que ser asi
fuente
Si no desea que el
const
miembro de datos de la clase sea estático, puede inicializar elconst
miembro de datos utilizando el constructor de la clase. Por ejemplo:si hay varios
const
miembros de datos en la clase, puede usar la siguiente sintaxis para inicializar los miembros:fuente
Puede actualizar su compilador para que sea compatible con C ++ 11 y su código funcionará perfectamente.
Use la lista de inicialización en el constructor.
fuente
Otra solucion es
Entonces t se inicializa en 100 y no se puede cambiar y es privado.
fuente
Si un miembro es una matriz, será un poco más complejo de lo normal:
o
fuente
Otra forma posible son los espacios de nombres:
La desventaja es que otras clases también pueden usar las constantes si incluyen el archivo de encabezado.
fuente
Esta es la forma correcta de hacerlo. Puedes probar este código.
si está utilizando
C++10 Compiler or below
, no puede inicializar el miembro de contras en el momento de la declaración. Entonces, aquí es necesario hacer que el constructor inicialice el miembro de datos const. También es necesario utilizar la lista de inicializadoresT1():t(100)
para obtener memoria al instante.fuente
puede agregar
static
para hacer posible la inicialización de esta variable miembro de clase.Sin embargo, esta no siempre es una buena práctica para usar dentro de la declaración de clase, porque todos los objetos instalados de esa clase compartirán la misma variable estática que se almacena en la memoria interna fuera de la memoria de alcance de los objetos instanciados.
fuente