Frage Wie man const Mitgliedsvariable in einer Klasse initialisiert?


#include <iostream>

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

  T1()
  {

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

Wenn ich versuche, die Konstante const zu initialisieren t mit 100. Aber es gibt mir den folgenden Fehler:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

Wie kann ich ein initialisieren? const Wert?


75
2018-01-24 06:53


Ursprung


Antworten:


Das const Variable gibt an, ob eine Variable änderbar ist oder nicht. Der zugewiesene konstante Wert wird jedes Mal verwendet, wenn auf die Variable verwiesen wird. Der zugewiesene Wert kann während der Programmausführung nicht geändert werden.

Bjarne Stroustrup Erläuterung fasst es kurz zusammen:

Eine Klasse wird normalerweise in einer Headerdatei deklariert und eine Headerdatei wird normalerweise in viele Übersetzungseinheiten aufgenommen. Um komplizierte Linkerregeln zu vermeiden, erfordert C ++ jedoch, dass jedes Objekt eine eindeutige Definition hat. Diese Regel würde durchbrochen werden, wenn C ++ die In-Class-Definition von Entitäten erlaubt, die als Objekte im Speicher abgelegt werden müssen.

EIN const Variable muss innerhalb der Klasse deklariert werden, aber sie kann nicht definiert werden. Wir müssen die const-Variable außerhalb der Klasse definieren.

T1() : t( 100 ){}

Hier die Zuordnung t = 100 passiert in der Initialisierungsliste, viel bevor die Klasseninitialisierung stattfindet.


89
2018-01-24 07:22



Nun, du könntest es schaffen static:

static const int t = 100;

oder Sie könnten einen Memberinitialisierer verwenden:

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

42
2018-01-24 06:56



Es gibt ein paar Möglichkeiten, die const Mitglieder innerhalb der Klasse zu initialisieren.

Definition von const Member im Allgemeinen, benötigt Initialisierung der Variablen auch ..

1) Innerhalb der Klasse, wenn Sie das const initialisieren möchten, ist die Syntax wie folgt

static const int a = 10; //at declaration

2) zweiter weg kann sein

class A
{
  static const int a; //declaration
};

const int A::a = 10; //defining the static member outside the class

3) Nun, wenn Sie nicht bei der Deklaration initialisieren möchten, dann ist der andere Weg zu Konstruktor, die Variable muss in der Initialisierungsliste (nicht im Körper des Konstruktors) initialisiert werden. Es muss so sein

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

23
2018-06-25 03:56



  1. Sie können Ihren Compiler aktualisieren, um C ++ 11 zu unterstützen, und Ihr Code würde perfekt funktionieren.

  2. Verwenden Sie die Initialisierungsliste im Konstruktor.

    T1() : t( 100 )
    {
    }
    

12
2018-01-24 06:57



Eine andere Lösung ist

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

Also wird t auf 100 initialisiert und es kann nicht geändert werden und es ist privat.


5
2017-11-18 10:46



Wenn ein Mitglied ein Array ist, wird es etwas komplexer als das normale:

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};

oder

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



Ein anderer möglicher Weg sind Namespaces:

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

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

Der Nachteil ist, dass andere Klassen die Konstanten auch verwenden können, wenn sie die Header-Datei enthalten.


2
2018-03-12 18:27



Wenn du das nicht machen willst const Datenelement in der Klasse statisch, Sie können das const Datenelement, das den Konstruktor der Klasse verwendet. Beispielsweise:

class Example{
      const int x;
    public:
      Example(int n);
};

Example::Example(int n):x(n){
}

wenn es mehrere gibt const Datenmitglieder in der Klasse können Sie die folgende Syntax verwenden, um die Mitglieder zu initialisieren:

Example::Example(int n, int z):x(n),someOtherConstVariable(z){}

2
2018-06-03 20:52



Du kannst hinzufügen static um die Initialisierung dieser Klassenmitgliedsvariablen zu ermöglichen.

static const int i = 100;

Dies ist jedoch nicht immer eine gute Methode, um innerhalb der Klassendeklaration zu verwenden, da alle Objekte, die aus dieser Klasse stammen, die gleiche statische Variable teilen, die im internen Speicher außerhalb des Bereichsspeichers von instanziierten Objekten gespeichert ist.


0
2018-05-19 14:46