# [C++] Konstruktor überladen



## frager (27. Juli 2004)

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:

```
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

```
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.


----------



## squeaker (27. Juli 2004)

war unqualifiziert - daher gelöscht. Sorry


----------



## Endurion (27. Juli 2004)

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.


----------



## squeaker (27. Juli 2004)

Danke - das wäre mein Lösungsvorschlag gewesen - auch wenn die Begründung dafür falsch war.


----------



## frager (27. Juli 2004)

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.:

```
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 
;-)


----------



## Kachelator (27. Juli 2004)

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:

```
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;
}
```


----------



## frager (27. Juli 2004)

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     ;-)


----------



## Kachelator (27. Juli 2004)

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.


----------



## Nebuchadnezar (30. Juli 2004)

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):

```
#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


----------



## squeaker (30. Juli 2004)

aber man kann nicht einen Konstruktor aus dem anderen aufrufen (was der Fehler war).


----------



## frager (30. Juli 2004)

Ja danke erstmal für eure Antworten,
aber ich wollte echt nur wissen, ob man einen Konstruktor einer Klasse aus einem anderen (der der gleichen Klasse gehört) heraus ausrufen kann.
Weil ich das Programmieren mit Java (davor war noch ein bisschen HTML aber das zählt ja nicht) angefangen habe und weil man das in Java sehr wohl machen kann, 
(Bsp)

```
public class test
{
	private int a = 0;
	private int b = 0;
	
	// erster Konstruktor
	public test(int a)
	{
		this.a = a;
	}
	
	// zweiter Konstruktor
	public test(int a, int b)
	{
		this(a); // Hier wird der erste Konsturktor aufgerufen!
		this.b = b;
	}
	
	public void ausgabe()
	{
		System.out.println("a = " + a);
		System.out.println("b = " + b);
	}
		
	
	public static void main(String argv[])
	{
		(new test(5, 7)).ausgabe();
	}
}
```
habe ich mir gedacht, warum nicht auch in C++?
Aber jetzt bin ich um einiges klüger ( ;-) ) geworden, und werde in Zukunft eine Initialisierungsfunktion verwenen.


----------



## Kachelator (30. Juli 2004)

```
this(a); // Hier wird der erste Konsturktor aufgerufen!
```
  Blasphemie!


----------



## frager (30. Juli 2004)

: Wozu ist der 'Thema abonnieren'-Button unten nach dem letzten Beitrag?


----------



## Kachelator (30. Juli 2004)

<ot>
Wenn du in einem Thread antwortest, abonnierst du das Thema automatisch, also du wirst per Mail benachrichtigt, wenn es was Neues gibt. Der Button ist vermutlich dazu da, dass du auch dann benachrichtigt wirst, wenn du selbst keinen Beitrag geleistet hast. Kann aber auch anders sein. Ich habe das Ding noch nie benutzt. Du fragst zuviel, frager. 
</ot>


----------



## frager (30. Juli 2004)

Hast du nach 1200+ Beiträgen schon eine E-Mail von tutorials.de bekommen?
(letzte Frage für heute)


----------

