PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : seltsamer Konstruktor



silic
20-06-2002, 17:18
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, 17:55
Hi!

Kapitel 14 Thinking in C++ Vol 1 Absatz über "The constructor initializer list"

c ya,
Tobias

anda_skoa
20-06-2002, 18: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,
_

silic
20-06-2002, 20:29
@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, 20: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,
_

silic
20-06-2002, 21:12
@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, 21: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,
_

silic
20-06-2002, 21:59
@ anda_skoa: vielen Dank für die Mühe, ich denke das ichs gerafft habe.:cool: :D

silic