wofür ist initialierungslist gut
-
wenn ich initialierungliste verwende, dann kann ich z.B. baseclass member initialisieren, ohne dafür eine Instanz zu erzeugen, etwa so:
CDerivedClass::CDerivedClass :CBaseClass(1, 2) //init baseclass's member { //without CBaseClass* b = new CBaseClass(1,2) }aber wenn es gibt gar keine member in Base Class, ich brauch nur member in der abgeleitete Klasse zu initialieren (builtin type), dann
CDerivedClass::CDerivedClass :i(0), j(0) //init baseclass's member { }ist gleich wie
CDerivedClass::CDerivedClass { i = 0; j = 0; }ist die Aussage richtig?
-
aber wenn es gibt gar keine member in Base Class, ich brauch nur member in der abgeleitete Klasse zu initialieren (builtin type), dann
Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.
Und Nein. Das ist nicht dasselbe. Da wird zuerst eine Initialisierung und dann eine Zuweisung durchgeführt.
Probier mal eine Konstante in die Klasse zu nehmen. Dann geht das nicht mehr.
-
der compiler sieht wenn du
CDerivedClass::CDerivedClass() { i = 0; j = 0; }schreibst folgendes:
CDerivedClass::CDerivedClass() : CBaseClass(), i(0), j(0) { i = 0; j = 0; }
-
drakon schrieb:
Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.
Ich würde wetten, dass Deutsch nicht seine Muttersprache ist. Spar dir doch deine hilfreichen Hinweise lieber für die echten Deppen auf, die keinen vernünftigen Satz in ihrer eigenen Sprache zusammenbringen. Gibt ja genug davon hier.
-
grmlfx schrieb:
drakon schrieb:
Bitte gibt dir mehr Mühe bei der Forumulierung. Das liest sich wie ein Käsekuchen.
Ich würde wetten, dass Deutsch nicht seine Muttersprache ist. Spar dir doch deine hilfreichen Hinweise lieber für die echten Deppen auf, die keinen vernünftigen Satz in ihrer eigenen Sprache zusammenbringen. Gibt ja genug davon hier.
Das habe ich mir auch gedacht, aber das ist kein Grund sich nicht Mühe zu geben.
Und ich mache das nicht, weil ich mich über jemanden Lustig machen will, sondern weil ich wirklich Mühe hatte die Frage zu verstehen, wenn es so wirr forumliert ist und wenn er hier öfters postet, dann ist das Wichtig für alle Beteiligten, wenn er lernt besseres Deutsch zu schreiben. Zumindest Satzstellung usw, sollten stimmen, dass man ohne Mühe den Text lesen kann und dann weiss, was er will.
-
blablabla deutschkenntnisse
es geht hier um den unterschied zwischen init liste und initialisieren im CTor
es ist so:
wenn du im CTor initialisierst macht dein computer ungefähr folgendes (stimmt nur von prinzip her, wie es umgesetzt ist ist ganz anders!)
class foo { int a; }; foo::foo() { a = 0; }der compiler macht das quasi so:
er sieht int a als zeiger auf einen int und im konstruktor erzeugt er den zeiger wie mit new, danach weist er ihm einen beliebigen startwert zu, und im CTor setzt du dann a = 0das verbraucht zeit
per init liste überspringt er den beliebigen startwert und setzt die variable direkt auf 0
ausserdem kann man per init lsit noch konstanten zuweisen
class test { public: test(int x); int const a; // = 5 geht nicht! }; test::test(int x) : a(x) // klappt alles ist ok { a = x; // geht nicht... }
-
er sieht int a als zeiger auf einen int und im konstruktor erzeugt er den zeiger wie mit new, danach weist er ihm einen beliebigen startwert zu, und im CTor setzt du dann a = 0
das verbraucht zeitper init liste überspringt er den beliebigen startwert und setzt die variable direkt auf 0
1. der Compiler muss hier keinen beliebigen Startwert zuweisen, der braucht nur die
Zeit um den Platz zu allokieren(das gebe ich dir Recht, die Allokation kostet Zeit)
2. wenn der Compiler macht wirklich einen Zeiger draus,(was der sowieso macht, egal ob per initlist od. in Ctor), dann ich sehe keinen Vorteil, weil die Zuweisung mit Default Wert wird nicht stattfinden.
3. es sei denn,CDerivedClass::CDerivedClass() { }in diesem Moment der Ctor von Base Klass schon aufgerufen, Platz für i wird allokiert (Zeitverbrauch 1)
dann in den geschleiften Klammern noch mal{ i = 0; //assignment operation called (Zeitverbrach 2) }d.h. wenn ich per initlist die Werte initialisiere, dann spare ich eine assignment operation.
-
neind as war im übertragenden sinne gemeint
was der compiler draus macht weis ich nicht
aber ich sagte man kann das mit zeigern und dem dynamischen kram vergleichen...