Was ist das hier?

  • Eine Plattform von Flensburger Studenten für Flensburger Studenten
  • Ein Wiki zum Sammeln von Wissen
  • Ein Forum zum Austausch
  • Eine Wissensdatenbank zum Informatikstudium:
    • Programmieren in C, C#, PHP, Javascript, HTML, CSS
    • Datenbanken und Abfragen mit SQL
    • 2D / 3D - Gestaltung
    • Mathe, Physik, Gerätetechnik, RoBs
    • Audio- / Videotechnik
    • ...und vieles mehr

Anmelden

Warum registrieren?

Weil besser als gut!

 

Konstruktoren (C++)

Eine Übersicht über Konstruktoren:
  • Konstruktoren erlauben, Instanziierung und Initialisierung zusammen in einer Operation auszuführen.
  • Konstruktoren sind spezielle Methoden, die bei der Instanziierung von Objekten ausgeführt werden, sie werden insbesondere zu Initialisierung eingesetzt
  • der Standard- oder Default-Konstruktor:
    • hat keine Argumente
    • wird vom Compiler als leere Methode generiert, wenn (und nur dann) kein anderer Konstruktor definiert ist
    • wird implizit ('automatisch') ausgeführt bei parameterloser Instanziierung und bei der Erstellung temporärer Objekte (z.B. Feld von Objekten instanziieren, ...)

Standardkonstruktor

Programmbeispiel (Konstruktoren)

[...]

C++
#include <iostream>
using namespace std;
 
/**
*	Maus
*	Eine Klasse ohne Konstruktor
*/
class Maus
{
private:
	int alter;
 
public:
	int getAlter() {	return alter;	}
};
 
 
/**
*	Loewe
*	Eine Klasse mit einem Konstruktor
*/
class Loewe
{
 private:
	int alter;
 
public:
	Loewe();
	int getAlter() {	return alter;	}
};
 
// Klassendefinition sollte in eigene Datei geschrieben werden!
Loewe::Loewe()
{
	alter = 42;
}
 
 
void main()
{
	Maus klaus;		// Aufruf des Konstruktors
	cout << klaus.getAlter() << endl;
 
	Loewe uwe;		// Aufruf des Konstruktors
	cout << uwe.getAlter() << endl;
}

Ausgabe der Release-Version

...

1	// Warum, ist nicht klar...
42	// Wie definiert.

Parameter

  • Konstruktoren können - wie andere Methoden auch - eine Parameterliste haben
  • die Parameter können - wie bei allen Funktionen - von rechts nach links mit Default-Werten versehen werden (nur im Prototyp angegeben)
  • werden für alle Parameter Default-Werte angegeben, so handelt es sich auch um einen Default-Konstruktor, der nicht gleichzeitig mit dem parameterlosen Konstruktor bestehen kann !
  • durch Überladung und gleichzeitige Verwendung von Parametern mit Default-Werten können Konflikte entstehen

Beispiele, Konstruktortypen

C++
// 1. Konstruktor
Mitarbeiter();
 
// 2. Konstruktor
Mitarbeiter( string name,
	string vorname, int alter );
 
// 3. Konstruktor
Mitarbeiter( short schuhgr,
	string name = "Petersen",
	string vorname = "Peter" );
 
// 4. Konstruktor
Mitarbeiter( int alter );
  • der Default-Konstruktor muss hier explizit implementiert werden, die Existenz von non-default Konstruktoren unterbindet die implizite Generierung des Default-Konstruktors durch den Compiler
  • der 3. Konstruktor kann mit 1, 2 oder 3 Parametern aufgerufen werden, d.h. er allein liefert eine dreifache Überladung
  • für schuhgr darf im 3. Konstruktor kein Defaultwert angegeben werden (Konflikt mit Standard-Konstruktor).

Mögliche Instanziierungen

Folgende Instanziierungen sind jetzt möglich:

C++
// 2. Konstruktor, expl. Aufrufform
Mitarbeiter franz = Mitarbeiter( "Schulze", "Franz", 55 );
 
// 2. Konstruktor, impl. Aufrufform
Mitarbeiter josef( "Meier", "Josef", 33 );
 
// 3. Konstruktor, impl. Aufrufform
Mitarbeiter max( 47, "Riesig" );
 
// 4. Konstruktor, impl. Aufrufform
Mitarbeiter bert( 40 );
 
// 4. Konstruktor, Sonderform des Aufrufs bei 1 Parameter
Mitarbeiter fritz = 65;
 
// Default-Konstruktor
Mitarbeiter* zm = new Mitarbeiter;

Objekte als Feldelemente

Werden Felder mit Objekten angelegt, so erfordert dies meistens die Existenz des Standard-Konstruktors - es sei denn, alle Elemente werden explizit mit einem anderen Konstruktor angelegt.

C++
Mitarbeiter team01[10];
Mitarbeiter team02[4] =
	{ 	Mitarbeiter("Finn", "Huck", 18 ),
		Mitarbeiter("Croft", "Lara", 19 ),
		Mitarbeiter("Max", "Moritz", 20 )
	};

Für team01 wird der Standard-Konstruktor 10-mal benötigt, für team02 einmal (für das letzte Element).

Optimierung mit init()-Methode

Der untenstehende Code zeigt anhand eines Beispiels, wie man mehrere Konstruktoren effizient mithilfe einer Methode init() vereinfachen kann. Der Name der Methode init() ist frei wählbar!

C++
//	constr.cpp
 
/**
*	Man stelle sich hier die ganzen Kopf-Informationen vor...
*/
 
class Buch
{
private:
	string titel;
	string autor;
	int seitenzahl;
	float preis;
 
	void init();
	int quatsch();
 
public:
	Buch();
	Buch( string Titel );
	Buch( int seitenzahl );
	Buch( float Preis, int Seitenzahl = 777 );
	Buch( string Autor, float Preis, string Titel = "BlaBla", int Seitenzahl = 1111 );
};
 
// private Funktion init() füllt die Variablen mit Standardwerten.
void Buch::init()
{
	titel = "Alle meine Enten";
	alter = "Donald Duck";
	seitenzahl = 42;
	preis = 42.0f;
}
 
int Buch::quatsch()
{
 	// erzeugt für ein Buch eine (wahrscheinlich) eindeutige Prüfsumme. Vielleicht.
 	return (title + autor).Length() + seitenzahl + (int)preis;
}
 
// Standardkonstruktor
Buch::Buch()
{
 	// Konstruktor ruft die Methode init() auf, welche das Objekt mit Standardwerten füllt.
	init();
}
 
// 2. Konstruktor
Buch::Buch( string Titel )
{
	init();
	titel = Titel;	// kein Konflikt, da case-sensitiv!
	// Auch möglich wäre dies:
	// this->titel = Titel;
}
 
// 3. Konstruktor
Buch::Buch( int seitenzahl )
{
	init();
	this->seitenzahl = seitenzahl;	// "this->" hier zwingend erforderlich, da Namenskonflikt! 
}
 
/**
*	Die anderen Konstruktoren folgen dem Schema.
*	Man stelle es sich vor...
*/

Aufruf

C++
void main()
{
 	// Standardkonstruktor
	Buch _0815;	// mit Unterstrich, da Variablen nicht mit Zahlen beginnen können!
 
	// 2. Konstruktor
	Buch grusel("FH by night");
 
	// 3. Konstruktor
	Buch kiddy(42);
 
	// 4. Konstruktor
	Buch dicky(29.95f, 888);
 
	// 5. Konstruktor
	Buch XXL1("Obelix", 4.98f, "Hinkelstein", 45);
	Buch XXL2("Obelix", 4.98f, "Hinkelstein");
 
	// Standard-Konstruktor
	Buch bibliothek[1000];
}


Kategorie: Programmieren2 | 2. Semester
| Mehr

Zahlen & Daten

  • 5064 Seitenaufrufe
  • 1129 Tage alt
  • 14 Versionen
  • Letzte Änderung: 17.04.2009 um 08:32 Uhr

Publish