2 Stimmen

Wo kann man Variablen in C++ deklarieren?

Ich lese C++ FAQs. In Kapitel 16, Verwenden von Static, heißt es:

"Ein const static Datenmitglied wird in der Klasse deklariert und wird normalerweise in einer Quelldatei, wie z.B. einer .cpp-Datei, definiert (und initialisiert). Aber in einigen Fällen kann es auch im Körper der Klasse initialisiert werden."

und geht dann darauf ein, wo ganze und nicht ganze Typen deklariert werden können (obwohl ich denke, dass sich dies für ganze Zahlen in C++11 geändert hat).

Meine Frage ist, gilt das obige nur für const static Datenmitglieder und nicht für nicht-const static Datenmitglieder?

Ich fange langsam an, wirklich verwirrt zu werden und sehe nicht, warum es diese Beschränkungen gibt? Gibt es diese Regeln auch für volatile, mutable und andere Schlüsselwortvariablen? Wie kann jemand dies leicht lernen (außer es ununterbrochen zu programmieren)?

3voto

Dietmar Kühl Punkte 145292

C++ 2011 hat nichts an der Deklaration von Variablen geändert! Allerdings können Sie alle Member-Variablen im Rumpf einer Klassendefinition initialisieren. Beim Konstruieren eines Objekts ist der im Klassenentwurf deklarierte Wert standardmäßig der verwendete Wert. Wenn die Member-Initialisierungsliste die Member erwähnt, hat die Initialisierungsliste jedoch Vorrang.

Statische Datenelemente müssen im Allgemeinen definiert werden. static und const Members können jedoch mit einer Deklaration und einer Initialisierung im Klassenrumpf davonkommen: Wenn das Member nicht an eine Referenz gebunden ist oder seine Adresse genommen wird, genügt die Deklaration und Sie müssen keine Definition bereitstellen. Wenn jedoch die Adresse genommen wird, muss sie dennoch definiert werden.

Hier sind ein paar Beispiele, wie Standards für die Member-Initialisierung festgelegt werden können:

class foo
{
private:
    int i{5};
    int j = 6;
    std::vector v{ 1, 2, 3, 4 };
    std::vector w = std::vector(2, 10);
    std::vector z = decltype(z)(2, 10);

    // ...
};

Beachten Sie, dass die Verwendung von Klammern nicht funktioniert. Es kann daher notwendig sein, eine der letzten beiden Formen oben zu verwenden.

1voto

Mark Ransom Punkte 283960

Die allgemeine Überlegung ist, dass es in einer Quelldatei definiert werden muss, wenn Speicherplatz benötigt wird. Wenn es sich um eine statische Konstante handelt, benötigt sie keinen Speicherplatz - der Compiler kann einfach überall, wo Sie die Variable verwenden, eine literale Ganzzahl einsetzen. Wenn es nicht statisch ist, handelt es sich um eine Membervariable, die in jedem Objekt Speicherplatz benötigt. Wenn es nicht konstant ist, benötigen Sie einen Ort, um den Wert zu speichern, wenn er aktualisiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X