Pregunta ¿Cómo inicializar la variable miembro de const en una clase?


#include <iostream>

using namespace std;
class T1
{
  const int t = 100;
  public:

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};

Cuando intento inicializar la variable miembro de const 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 ¿valor?


75
2018-01-24 06:53


origen


Respuestas:


los const variable especifica si una variable es modificable o no. El valor constante asignado se usará cada vez que se haga referencia a la variable. El valor asignado no se puede modificar durante la ejecución del programa.

Bjarne Stroustrup's explicación lo resume brevemente:

Por lo general, una clase se declara en un archivo de cabecera y, por lo general, un archivo de cabecera se incluye en muchas unidades de traducción. Sin embargo, para evitar reglas de enlazador complicadas, C ++ requiere que cada objeto tenga una definición única. Esa regla se rompería si C ++ permitiera la definición dentro de la clase de las entidades que debían almacenarse en la memoria como objetos.

UN 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 se produzca la inicialización de la clase.


89
2018-01-24 07:22



Bueno, podrías hacerlo static:

static const int t = 100;

o puede usar un inicializador de miembro:

T1() : t(100)
{
    // Other constructor stuff here
}

42
2018-01-24 06:56



Hay algunas maneras de inicializar los miembros de la clase 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 quieres inicializar la const la sintaxis es como esta

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 quieres inicializar en la declaración, entonces la otra forma es a través del constructor, la variable necesita ser inicializada en la lista de inicialización (no en el cuerpo del constructor). Tiene que ser así

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};

23
2018-06-25 03:56



  1. Puede actualizar su compilador para que sea compatible con C ++ 11 y su código funcionaría perfectamente.

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

    T1() : t( 100 )
    {
    }
    

12
2018-01-24 06:57



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.


5
2017-11-18 10:46



Si un miembro es una matriz, será un poco 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) {}
};

3
2017-10-01 04:35



Otra posible forma son los espacios de nombres:

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

class T1
{
   public:
   T1()
   {
       cout << "T1 constructor: " << mySpace::T << endl;
   }
};

La desventaja es que otras clases también pueden usar las constantes si incluyen el archivo de encabezado.


2
2018-03-12 18:27