[C++] Konstruktor überladen

frager

Erfahrenes Mitglied
Hier wieder mal eine dumme Frage von mir:

Wie überlädt man richtig den Konstuktor einer Klasse? (geht das überhaupt)
Ich habe mal folgendes versucht:
Code:
class test
{
	private:
		int buf[20];
		int i;
	public:
		test();
		test(int i);
};
...
test::test()
{
	i = 0;
	memset(this->buf, 0, sizeof(int)*20);
}

test::test(int i)
{
	test();
	this->i = i;
}
;
Wenn ich jetzt den Test mit
Code:
test t(5);
;
instanziiere, wird 'buf' nicht initialisiert, sondern mit zufälligen Werten gefüllt.
Warum?

Die Antwort ist bestimmt leichter als ich denke, aber komme einfach nicht drauf :( :(
Kann jemand helfen? Danke.
 
Soweit ich weiss, kann in C++ ein Constructor nicht einen anderen aufrufen. Ich wundere mich, dass das überhaupt kompiliert?

Rufe im zweiten Constructor den Code direkt auf oder bastle eine Memberfunktion, die die Klasse initialisiert.
 
Danke - das wäre mein Lösungsvorschlag gewesen - auch wenn die Begründung dafür falsch war.
 
jo, danke für die Antworten und den Tipp mit der Initialisierungsfunktion.
Diese Vorgehensweise bin ich noch von Java gewohnt (da ging das mit this(), glaube ich, ach ich habe zur Zeit keinen Plan von gar nix, egal).

Äh, noch einen kleine Frage am Rande:
wenn Ich in einer Klasse eine Andere als Member habe
(Bsp.:
Code:
class zyx
{
	public:
		zyx();
		zyx(int i);
};

class abc
{
	private:
		zyx yx;
	public:
		abc();
};
;
);
wird dann der (parameterlose?)Konstruktor der Klasse zyx bei Instanziieren der Klasse abc aufgerufen? (Vermutung:ja)
1.Frage: Was ist wenn die Klasse keinen parameterlosen Konsturktor hat?
2.Frage: Wie erreicht man, dass ein anderer Konstruktor aufgerufen wird?
(gerade eingefallen (!): Pointer verwenden und die Klasse dann z.B. mit
new zyx(5) dynamisch allozieren (!), aber vielleicht geht das ja auch anders)

O.K, danke schon mal für eure ausführlichen Antworten
;-)
 
1. Der wird für jede Klasse vom Compiler automatisch erzeugt. (Das heisst aber nicht, dass der immer das Gewünschte tut.) Man könnte ihn höchstens private machen, um seinen Gebrauch zu verhindern.

2. Du kannst die Konstruktoren der Member in der Initialisierungsliste aufrufen. Das ist ohnehin häufig der günstigere Weg, weil so die Member nicht erst mal via Defaultkonstruktor erzeugt werden und dann per Zuweisungsoperator nachträglich initialisiert. Ein Beispiel für eine einfache Klasse:
Code:
class test
{
  //...
  int i;
  std::string s;

public:
  test( int j );

  //...
};

test::test( int j )
: i( j ), s( "hallo welt" ) // <- initialisierungsliste
{
  // sonstige initialisierung
  std::cout << s << std::endl;
}
 
Zuletzt bearbeitet:
Super! Danke! :) :) ;) :) ;-) :) :)

Edit:
P.S ich sollte die Bücher genauer lesen. Das mit den Initialisierungslisten hab ich schon mehrer Male gesehen, bin aber trotzdem nicht drafgekommen :-( .
Vielleicht liegt es auch daran das ich nur Beispiele gesehen habe wo die Initialisierungslisten für die Standard-Datentypen wie int oder float verwendet wurden. (Ich hab mir noch gedacht: wieso schreibt man i(2) statt einfach i = 2 zu schreiben)
Naja, hauptsache wieder was neues gelernt, Nochmal danke :) :) :) ;) ;-) ;) :)
 
Zuletzt bearbeitet:
Danke für die vielen Smilies! Wenn man mitbekommt, dass das Antworten weitergebracht hat und nicht umsonst war, macht es gleich viel mehr Spass!

Musste ich mal loswerden. :)
 
Ich kann zwar nicht behaupten dass ich C++ erfunden hätte aber eins weis ich: Man kann sehrwohl einen Konstruktor überladen - hab erst vor einer Woche mein Wissen über Klassen aus einem Buch auf Vordermann gebracht und genau das hab ich vor 3 oder 4 Tagen gelesen: Solange er an den Parametern unterscheiden kann welcher Konstruktor gewählt werden soll - zumindest weis ich, dass es als inline Funktion geht( wenn ich jetzt den richtigen Ausdruck dafür verwendet habe):
Code:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <mem.h>

class test  {
private:
	int buf[20];
	int i;
public:

void i_Ausgeben();

test()   //Erster Konstruktor
{
	i = 0;
	memset(this->buf, 0, sizeof(int)*20);
}
test(int p_i)   //Überladener Konstruktor
{
	i = p_i;
}

};

void main(){
test t(5);
t.i_Ausgeben();
getch();
}

void test::i_Ausgeben()
{
	printf("%d",i);
}

kann jetzt nicht sagen ob das genau das ist was du willst aber auf diese Weise kannst du einen Konstruktor überladen.

mfg Ðr0_S3/\//\/!n
 
Zurück