Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstruktoraufruf in der Elementinitialisierungsliste

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.02.2009, 21:48 Uhr
banshee




C++:
Foo::Foo() : Object(bar, 1)


Ist das äquivalent zu:


C++:
Foo::Foo()
{
  Object(bar, 1);
}


?

Und bei der Gelegenheit: Was bringt die Elementinitialisierungsliste überhaupt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.02.2009, 22:25 Uhr
0xdeadbeef
Gott
(Operator)


Nein, es ist nicht äquivalent. Überhaupt sind die beiden Codeteile nur vage vergleichbar, wenn Object eine Basisklasse von Foo ist, in welchem Fall letzterer Code lediglich eine temporäre Object-Instanz in Foo::Foo() erzeugt und this völlig unverändert lässt.

Die Initialisierungsliste ist in zwei Zusammenhängen interessant - Basisklassen bzw. Memberobjekte mit parametrisierten Konstruktoren und Referenzen. Zum Beispiel:

C++:
#include <iostream>

struct A {
  A(int x) { std::cout << x << std::endl; }
};

struct B {
  B() : a(2) { } // Ruft A::A(int) mit x = 2 auf

  A a;
};

struct C {
  C(A &b) : a(b) { } // bindet a an b

  A &a;
};


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2009, 11:56 Uhr
banshee




Zitat von 0xdeadbeef:
Nein, es ist nicht äquivalent. Überhaupt sind die beiden Codeteile nur vage vergleichbar, wenn Object eine Basisklasse von Foo ist, in welchem Fall letzterer Code lediglich eine temporäre Object-Instanz in Foo::Foo() erzeugt und this völlig unverändert lässt.


Genau das ist der Fall. Was passiert dabei im ersten Fall, denn Object ist in diesem Fall keine Instanz sondern der Klassenname.


Zitat von 0xdeadbeef:


C++:
#include <iostream>

struct A {
  A(int x) { std::cout << x << std::endl; }
};

struct B {
  B() : a(2) { } // Ruft A::A(int) mit x = 2 auf

  A a;
};

struct C {
  C(A &b) : a(b) { } // bindet a an b

  A &a;
};




Man könnte aber doch ganz normal auch


C++:
struct B {
  B() {
    a(2);
  }

  A a;
};


schreiben. Das dient also nur stilistischer Verschönerung oder wie?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.02.2009, 12:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat:

Das dient also nur stilistischer Verschönerung oder wie?



nein eben nicht, das dürfte dir nicht kompilieren, wenn A keinen Defaultkonstruktor hat. Außerdem wäre dann a(2) ein Funktionsaufruf der (nicht vorhandenen) Funktion a(int)
--
class God : public ChuckNorris { };

Dieser Post wurde am 20.02.2009 um 12:09 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.02.2009, 20:05 Uhr
0xdeadbeef
Gott
(Operator)


Damit das kompiliert, muss A sowohl einen Defaultkonstruktor als auch einen operator()(int) haben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.02.2009, 15:21 Uhr
banshee



Kann man das irgendwo mal nachlesen bzw. gibts da ein Stichwort, mit dem man google bedienen kann und nicht auf jedem 0815 Tutorial landet, was erklärt, was Konstruktoren sind?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.02.2009, 18:23 Uhr
0xdeadbeef
Gott
(Operator)


http://de.wikipedia.org/wiki/Initialisierungsliste
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: