tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von deepthroat
  • 1 Beitrag von Adrian_Broher
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
858
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Onkel Schuppig Onkel Schuppig ist offline Mitglied Gold
    Registriert seit
    Apr 2005
    Beiträge
    191
    Hallo Leute,
    ich habe ein Problemchen mit Felder initialisieren.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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?
     
    Grüße OS

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Onkel Schuppig Beitrag anzeigen
    Es wird ja immer gesagt, man soll die Constructor Initialiser List verwenden, wann immer möglich, weil es sonst Performance-Einbußen gibt.
    Das gilt aber nur wenn man dadurch unnötige Initialisierungen und zusätzliche Zuweisungen vermeidet.

    Was passiert denn bei einem Array wenn es konstruiert wird? Wie wird es initialisiert?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Onkel Schuppig Onkel Schuppig ist offline Mitglied Gold
    Registriert seit
    Apr 2005
    Beiträge
    191
    Zitat Zitat von deepthroat Beitrag anzeigen
    Was passiert denn bei einem Array wenn es konstruiert wird? Wie wird es initialisiert?
    Fragst du das mich? Ich bin kein Compiler.
     
    Grüße OS

  4. #4
    Tuxtrainer Tutorials.de Gastzugang
    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.
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Tuxtrainer Beitrag anzeigen
    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ß
    Onkel Schuppig bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Adrian_Broher Adrian_Broher ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    166
    Wenn das Array static const ist waere folgendes moeglich:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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.
    Onkel Schuppig bedankt sich. 
    I'm not slacking off!

    My code's just compiling.

  7. #7
    Onkel Schuppig Onkel Schuppig ist offline Mitglied Gold
    Registriert seit
    Apr 2005
    Beiträge
    191
    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!
     
    Grüße OS

  8. #8
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Zitat Zitat von Onkel Schuppig Beitrag anzeigen
    Aber du musst mich verwechseln: Ich bin nicht der mit der Schrotflinte!
    "C macht es einfach, sich in den Fuß zu schießen; C++ erschwert es, aber wenn man es tut, bläst es einem das ganze Bein weg." —Bjarne Stroustrup

    Ich denke es war eine Anspielung darauf
     

Ähnliche Themen

  1. Problem JavaCC "Second call to constructor"
    Von MadMax2581 im Forum Java
    Antworten: 2
    Letzter Beitrag: 24.08.10, 15:30
  2. "auto_increment" Feld erst später füllen ?
    Von baeckerjunge im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 27.09.07, 09:13
  3. Error: "scroll is not a constructor"
    Von redX im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 08.11.06, 15:52
  4. Edit Feld in "Single document" wie in "Dialog based"
    Von excelite im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 26.01.06, 08:24
  5. Antworten: 7
    Letzter Beitrag: 04.03.05, 14:07