Feld mittels "constructor initialiser list" füllen

Onkel Schuppig

Erfahrenes Mitglied
Hallo Leute,
ich habe ein Problemchen mit Felder initialisieren.

Code:
struct Beispiel {
  Beispiel();    // constructor
  double x[4];  // Daten
};

// Methode 1: wird vom Compiler verweigert
Beispiel::Beispiel() : x[0](0.0), x[1](0.0), x[2](0.0), x[3](0.0) { }

// Methode 2: zulässig
Beispiel::Beispiel() {  x[0] = x[1] = x[2] = x[3] = 0.0; }

Es wird ja immer gesagt, man soll die Constructor Initialiser List verwenden, wann immer möglich, weil es sonst Performance-Einbußen gibt. Nur scheint das hier nicht zu gehen. Oder geht es doch?
 
Constructor Initialiser Listen dienen dazu Kontruktor-Argumente an die Konstruktoren der Basisklasse(n) weiterzureichen (also nach "unten" durchzureichen)
versus der Zuweisung innerhalb des Konstruktors der abgeleiteten Klasse.
Neben der Performancethematik funktioniert die Zuweisung innerhalb des Konstruktors der abgeleiteten Klasse auch nur bei public-Elementen der Bsasisklasse(n).

Die reine __Initialisierung__ sollte immer innerhalb des "eigenen" Konstruktors erfolgen.

Methode 2 ist ergo nicht nur zulässig sondern auch genau passend.
 
Die reine __Initialisierung__ sollte immer innerhalb des "eigenen" Konstruktors erfolgen.
Was ist denn eine "reine Initialisierung"?

@Onkel Schuppig: Arrays (wie auch primitive Typen) werden grundsätzlich nicht initialisiert, sonst müßtest du es ja nicht manuell tun. Für diese Typen ist es dann im Grunde auch egal ob du sie in der Initialization List oder im Konstruktorblock initialisierst.

Gruß
 
Wenn das Array static const ist waere folgendes moeglich:

Code:
class Foo
{
public:
	Foo() {}

private:
	static const int array[6];
};

const int Foo::array[6] = {0, 1, 2, 3, 4, 5};

Alles andere ist im aktuellen ISO Standard von c++ nicht moeglich, wird aber mit c++0x kommen. Also demnaechst... heh.

Code:
class Foo
{
public:
	Foo(): array({0, 1, 2, 3, 4, 5}) {}

private:
	int array[6]; // 0, 1, 2, 3, 4, 5
};

class Bar
{
public:
	Bar(): array({0}) {}

private:
	int array[6]; // 0, 0, 0, 0, 0, 0
};

Kompiliert mit dem -std0c++0x Parameter unter gcc 4.4.1

Viel Spass mit deiner neuen Schrotflinte und nicht auf deine Beine zielen.
 
Gut.
Ich weiß jetzt, dass es egal ist, ob in der Initialisierungsliste oder im Konstruktor selbst das Array mit Nullen gefüllt wird. Dann werde ich es für meine Anwendung, bei der es auf Performance ankommt, nach Methode 2 machen.
Ich probiere selbst noch aus, ob es mit memset noch schneller geht.

@Adrian_Broher:
Das demnächst ein neuer Standard rauskommt, ist auch interessant.
Aber du musst mich verwechseln: Ich bin nicht der mit der Schrotflinte! ;-)
 
Zurück