2010-01-11 6 views
16

bool "bar" ist standardmäßig wahr, aber es sollte falsch sein, es kann nicht im Konstruktor initialisiert werden. Gibt es eine Möglichkeit, es als falsch zu initiieren, ohne es statisch zu machen?Warum ist ein C++ bool var standardmäßig true?

vereinfachte Version des Codes:

foo.h

class Foo{ 
public: 
    void Foo(); 
private: 
    bool bar; 
} 

foo.c

Foo::Foo() 
{ 
    if(bar) 
    { 
    doSomethink(); 
    } 
} 
+10

Warum können Sie es nicht im Konstruktor initialisieren? – Kena

+0

Da der Konstruktor mehr als einmal aufgerufen werden kann, darf ich diese Routine nicht ändern, weil es keinen größeren Softwarefrieden geben würde :( – Christoferw

+27

Wie würde der Konstruktor jemals mehr als einmal aufgerufen werden? – jalf

Antwort

63

In der Tat, es ist nicht standardmäßig initialisiert alle. Der Wert, den Sie sehen, sind einfach einige Papierkorbwerte im Speicher, die für die Zuordnung verwendet wurden.

Wenn Sie einen Standardwert festlegen möchten, werden Sie es im Konstruktor fragen:

class Foo{ 
public: 
    Foo() : bar() {} // default bool value == false 
    // OR to be clear: 
    Foo() : bar(false) {} 

    void foo(); 
private: 
    bool bar; 
} 

UPDATE C++ 11:

Wenn Sie eine C++ verwenden 11 Compiler, können Sie jetzt stattdessen standardmäßig konstruieren:

class Foo{ 
public: 
    // The constructor will be generated automatically, except if you need to write it yourself. 
    void foo(); 
private: 
    bool bar = false; // Always false by default at construction, except if you change it manually in a constructor's initializer list. 
} 
+8

und daher haben Sie eine fast 100% ige Chance, dass 'if (bar)' wahr ist. –

+2

einige Compiler initialisieren den Speicher in Debug-Builds zu einem bestimmten Muster. Wenn Sie einen dieser Compiler verwenden, haben Debug-Builds eine Wahrscheinlichkeit von 100%, dass der Balken wahr ist. –

+1

IIRC Darwin initialisiert den Speicher standardmäßig auf Null. Sie können also auch scheinbar plattformübergreifend inkonsistentes Verhalten erhalten. –

1

C/C++ initialisieren Variablen überhaupt nicht für Sie. Der Speicherplatz, der jetzt von bar benutzt wird, hat einen Wert, der als "wahr" interpretiert wird. Dies wird nicht immer der Fall sein. Sie müssen es in Ihrem Konstruktor initialisieren.

+0

Es kommt darauf an. POD-Membervariablen werden nicht initialisiert, aber Nicht-POD-Member werden standardmäßig konstruiert. Und natürlich werden globale/statische Variablen initialisiert. – jamesdlin

1

Dieses Programm hat ein undefiniertes Verhalten. Intrinsische Typen haben keine Konstruktoren. Sie könnten bool bar = bool(); tun, aber es ist besser, den tatsächlichen Wert in Ihrer foo-Klasse zu definieren.

0

Try this:

class Foo 
{ 
    public: 
    void Foo(); 
    private: 
    bool bar; 
} 

Foo::Foo() : bar(false) 
{ 
    if(bar) 
    { 
    doSomething(); 
    } 
} 
+0

foo() ist nicht Foo() ... – Klaim

+0

Hoppla, @Klaim Beat mich ein Beispiel zu geben. – Bill

+0

foo() ist ein Tippfehler, foo() sollte Foo() sein – Christoferw

-1

Sie können eine beliebige Variable initialisieren, wenn Sie es erklären.

bool bar = 0; 
+0

Ich dachte das gleiche, aber ich bekomme einen C2864 Fehler dann: nur statische const integral Datenelemente können innerhalb einer Klasse initialisiert werden – Christoferw

+1

Dies gilt für lokale Variablen, aber nicht für Klassenmitglieder. – Bill

+2

Aber nicht vor C++ 0x ... – Debilski

4

Klaims Antwort ist genau richtig. Um Ihr Problem zu "lösen", können Sie eine constructor initialization list verwenden. Ich empfehle Ihnen dringend, diese Seite zu lesen, da sie möglicherweise ähnliche Fragen in Zukunft klären kann.

0

Da Sie den Wert von bar in der Ctor verwenden, nehme ich an, Sie versuchen, es vor der Erstellung des Objekts zu setzen? Ich denke, Sie wollten es zu einer statischen Klassenvariablen anstatt einer Instanzvariablen machen.

Verwandte Themen