Chaitanya
#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
Cuando estoy tratando de inicializar el const
miembro de datos t
con 100. Pero me está dando 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
¿miembro?
Dinkar Thakur
El 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.
de Bjarne Stroustrup explicación lo resume brevemente:
Por lo general, una clase se declara en un archivo de encabezado y un archivo de encabezado generalmente se incluye en muchas unidades de traducción. Sin embargo, para evitar reglas de vinculación complicadas, C++ requiere que cada objeto tenga una definición única. Esa regla se rompería si C ++ permitiera la definición en clase de entidades que debían almacenarse en la memoria como objetos.
A const
La variable debe declararse dentro de la clase, pero no puede definirse en ella. Necesitamos definir la variable const fuera de la clase.
T1() : t( 100 ){}
Aquí la tarea t = 100
sucede en la lista de inicializadores, mucho antes de que ocurra la inicialización de la clase.
-
¿Puedes ser un poco más elaborado en la última afirmación?
Here the i = 10 assignment in initializer list happens much before the class initilizaiton occurs.
No entiendo esto. Y básicamente ese tipo de permitir definiciones dentro de la clase es específico del compilador, ¿verdad?– Chaitanya
24 de enero de 2013 a las 7:31
-
Tengo constantes en mi clase que inicializo de la manera anterior. Sin embargo, cuando trato de crear un objeto de esa clase, me da un error que dice que
operator = function not found
en VC++. ¿Cual puede ser el problema?– Rohit Shinde
26/10/2014 a las 15:30
-
Cuando usa las palabras exactas de alguien sin atribución, se llama plagio. Utilice la atribución adecuada; consulte stroustrup.com/bs_faq2.html#en-clase y stackoverflow.com/questions/13662441/…
– Tanaya
11 de octubre de 2015 a las 3:04
-
Sí, tampoco entiendo totalmente el código en la respuesta, ¿qué demonios es eso? ¿Se puede colocar en la implementación del archivo cpp?
– Tomáš Zato
1 de diciembre de 2015 a las 15:56
-
Buena explicación. Pero podría valer la pena agregar que sólo
static const int
se les permite inicializarse dentro de la propia declaración de clase.– ViFI
29 de junio de 2016 a las 18:19
Bueno, podrías hacerlo static
:
static const int t = 100;
o podría usar un inicializador de miembros:
T1() : t(100)
{
// Other constructor stuff here
}
-
Para su uso (y/o propósitos), sería mucho mejor hacerlo estático.
– Marcos García
24 de enero de 2013 a las 7:01
-
@FredLarson ¿Es como si algunas versiones de g ++ no permitieran ese tipo de inicializaciones? o ¿No está permitido en absoluto?
– Chaitanya
24 de enero de 2013 a las 7:11
-
@Chaitanya: C++11 Los inicializadores de miembros no estáticos se implementan desde gcc 4.7.
– Jesse bueno
24 de enero de 2013 a las 7:31
-
@MarkGarcia ¿por qué mucho mejor? podría ser por requerimiento si
const member
debe ser accesible desde las funciones/objetos, entonces ¿por qué estático?-Asif Mushtaq
10 de febrero de 2016 a las 16:28
-
Aunque por lo general es engañoso dar un ejemplo a los principiantes de la estática. Porque es posible que no sepan que es solo uno para todas las instancias (objetos) de esa clase.
– Silidrona
19 de agosto de 2017 a las 21:27
ravs2627
Hay un par de formas de inicializar los miembros constantes dentro de la clase.
La definición de miembro const en general, también necesita la inicialización de la variable.
1) Dentro de la clase, si desea inicializar la const, la sintaxis es así
static const int a = 10; //at declaration
2) La segunda forma puede ser
class A
{
static const int a; //declaration
};
const int A::a = 10; //defining the static member outside the class
3) Bueno, si no desea inicializar en la declaración, entonces 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
class A
{
const int b;
A(int c) : b(c) {} //const member initialized in initialization list
};
-
Creo que esta respuesta necesita aclaración. El uso de la palabra clave estática para un miembro de la clase no agrega una sintaxis arbitraria para hacer feliz al compilador. Significa que hay una sola copia de la variable para todas las instancias del objeto, constante o no. Es una elección de diseño que necesita ser considerada cuidadosamente. Más adelante, el programador podría decidir que este miembro de clase constante aún podría variar con diferentes objetos, a pesar de permanecer constante durante la vida útil de un objeto determinado.
– opetrenko
16 de julio de 2014 a las 15:38
-
De acuerdo… Cuando usamos estática, crea solo una copia para todos los objetos… Como mencionaste, es una elección de diseño. En caso de copia única para todos los objetos 1 y 2 debería funcionar. En caso de copia individual para cada objeto, 3 funcionarían
– ravs2627
4 de agosto de 2014 a las 13:19
-
Esta respuesta sugiere un cambio de sintaxis simple sin consecuencias, mientras que cambiarlo para que sea estático no lo es.
– Isaac Woods
9 de noviembre de 2015 a las 17:25
-
¿Qué sucede si necesita usar doble o flotante? ¿Es esto parte del estándar C++ 11?
– sérum
5 de febrero de 2019 a las 8:54
GANESH BK
Si no quieres hacer la const
miembro de datos en clase estática, puede inicializar el const
miembro de datos utilizando el constructor de la clase. Por ejemplo:
class Example{
const int x;
public:
Example(int n);
};
Example::Example(int n):x(n){
}
si hay varios const
miembros de datos en clase, puede usar la siguiente sintaxis para inicializar los miembros:
Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
borisbn
-
Puede actualizar su compilador para admitir C++ 11 y su código funcionará perfectamente.
-
Use la lista de inicialización en el constructor.
T1() : t( 100 ) { }
Angustia
Otra solución es
class T1
{
enum
{
t = 100
};
public:
T1();
};
Entonces t se inicializa a 100 y no se puede cambiar y es privado.
Si un miembro es una matriz, será un poco más complejo de lo normal:
class C
{
static const int ARRAY[10];
public:
C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
o
int* a = new int[N];
// fill a
class C {
const std::vector<int> v;
public:
C():v(a, a+N) {}
};
con c ++ 11 esto es posible, consulte este enlace stackoverflow.com/questions/13662441/…
– PapaDiHatti
30 de mayo de 2016 a las 8:10
c ++ 11 admite llaves o es igual al inicializador incluido en la declaración del miembro
– Cauchy Schwarz
2 de febrero de 2021 a las 17:26