¿Cómo inicializo un miembro de datos const?

6 minutos de lectura

Avatar de usuario de Chaitanya
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?

  • 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

Avatar de usuario de Dinkar Thakur
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

avatar de usuario de ravs2627
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

Avatar de usuario de GANESH BK
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){}

avatar de usuario de borisbn
borisbn

  1. Puede actualizar su compilador para admitir C++ 11 y su código funcionará perfectamente.

  2. Use la lista de inicialización en el constructor.

    T1() : t( 100 )
    {
    }
    

Avatar de usuario de Pang
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) {}
};

¿Ha sido útil esta solución?