Archiv verlassen und diese Seite im Standarddesign anzeigen : seltsamer Konstruktor
Hi folks,
in folgendem Fragment verstehe ich die Rolle von x nicht, wieso wird x als funktion aufgerufen wo es doch als int deklariert ist ?
using namespace std;
class classtest {
int x;
public:
classtest(int i):x(i){}
};
int main(void)
{
classtest ct(10);
};
:confused: silic
tkortkamp
20-06-2002, 18:55
Hi!
Kapitel 14 Thinking in C++ Vol 1 Absatz über "The constructor initializer list"
c ya,
Tobias
anda_skoa
20-06-2002, 19:48
Kurze Zusammenfassung:
Dieser Ausdruck ist eine Variableninitialisierung.
Damit kann man zB Memebervariablen initialisiren, die selber Klassen sind, aber keinen zuweisguns Operator oder Copyconstructor haben, wo so etwas nicht geht:
myClass = MyClass(5);
Im header ist myClass definiert als
MyClass myClass:
Und selbst wenn es ginge, würden dabei zwei Instanzen angelegt.
Einmal, wenn die Variable initialisiert wird und dann wenn du ihr den eigenlichen Wert zu weist.
Außerdem braucht die Klasse des Members dann eine Defaultconstructor AFAIK.
Ciao,
_
@anda_skoa: dies leuchtet mir noch nicht komplett ein, ich weiss jetzt nur mit sicherheit das in meinem beispiel x mit 10 initialisiert wurde, so wie du auch von initialisierung sprichst. den rest verschiebe ich auf später wenn ich mehr übung mit classes habe:rolleyes:
silic
anda_skoa
20-06-2002, 21:49
Kleines Beispiel:
class Test1
{
public:
Test1(int i) {x = i; }
private:
int x;
};
class Test2
{
public:
Test2(int i) {};
private:
Test1 test;
};
int main()
{
Test2(4);
}
Das kompiliert nicht, weil es für Tes1 keinen Konstruktor ohne Argumente gibt.
Es geht nur wenn der Konstrutor von Test2 mit einer Initalisierungsliste benutz wird:
Test2(int i) : test(i) {};
Ciao,
_
@anda_skoa: wenn ich das richtig kapiert habe, liegt das ganze problem daran, das wenn von einer Klasse eine Instanz erzeugt wird die eine classendef. als member hat, so kann nicht implizit ein konstruktor auf die memberinstanz angewandt werden. Sehe ich das richtig ?
silic
anda_skoa
20-06-2002, 22:55
Fast :)
Wenn Test1 in meinem Beispiel einen Konstrutor ohne Parameter hätte, also
class Test1
{
public:
Test1() {};
}
Dann kann der Compiler diesen implizit benutzen, wenn er die Variablen anlegt.
Aber Test1 hat eben keinen solchen Konstruktor, darum kann ihn der Kompiler nicht benutzen und kann darum auch nicht fertig kompilieren.
Ciao,
_
@ anda_skoa: vielen Dank für die Mühe, ich denke das ichs gerafft habe.:cool: :D
silic
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.