klassen-member initialisieren
-
hi,
hier mal kurze veranschaulichung
class foo { public: void init( int ta, int tb, int tc ) { a=ta; b=tb; c=tc; } private int a,b,c; };
das ging doch auch besser? ohne temporäre variablen? aber wie?
-
Mit einer Initialisierungsliste im Konstruktor:
class foo { public: foo(int ta, int tb, int tc) : a(ta), b(tb), c(tc) {} private int a,b,c; };
edit: Temporäre Variablen gibt es hier natürlich trotzdem, Stichwort call-by-value; fällt bei ints allerdings nicht so arg schlimm ins Gewicht...
-
welchen vorteil hat diese methode überhaupt?
-
Effizienz und Du kannst so auch konstante Membervariablen bzw. Members die Referenzen sind initialisieren.
-
bei der ersten methode werden die variablen zuerst mit einem default wert initialisiert, und erst dann mit einem wert belegt,bei der anderen werden die variablen direkt mit den entsprechenden werten erstellt.
dazu kommt noch, dass man mit der ersten methode sowas nicht machen kann:
struct A{ A(int){} }; class B{ A a; public: B(){} };
es gibt keinen default ctor für a, und deshalb kann die Klasse so nicht initialisiert werden->compile error.
dasselbe gilt auch für jedwede const werte.
-
Ein weiterer Vorteil ist auch, das man die Init-Methode nicht mehr aufrufen muss. Man vermeidet also Fehler durch nicht initialisierte Variablen
-
und man kann Basisklassenkonstruktoren aufrufen.