C++-Programmierung/ Eigene Datentypen definieren/ Das Klassenkonzept

Aus Wikibooks

Wechseln zu: Navigation, Suche


Klassen sind ein wesentlicher Bestandteil der objektorientierten Programmierung. Objektorientiert zu programmieren heißt, Daten und die Funktionen, die darauf angewendet werden, möglichst dicht zusammen zu bringen. Eine Klasse tut genau das: sie beinhaltet Daten und Funktionen. Nach außen hin können die Daten in der Regel nicht direkt zugegriffen werden. Die Verarbeitung der Daten erfolgt über Funktionen der Klasse.

Korrekterweise enthält eigentlich nicht die Klasse die Daten, sondern die Objekte, die von dieser Klasse erzeugt werden. Die Klasse selbst beschreibt lediglich, welche Daten ein Objekt enthalten kann und die Funktionen, die darauf angewendet werden können. Eine Klasse ist also vergleichbar mit einem Datentyp, ein Objekt entspricht dann einer Variablen dieses Datentyps. Tatsächlich werden die Begriffe üblicherweise synonym verwendet.

[Bearbeiten] Ein eigener Datentyp

Nun wird es aber Zeit, dass wir auch mal eine eigene Klasse schreiben.

Crystal Clear app terminal.png
#include <iostream>

class Auto{
public:
    Auto(int tankgroesse, float tankinhalt, float verbrauch);

    void info()const;

    bool fahren(int km);
    void tanken(float liter);

private:
    int   m_tankgroesse;
    float m_tankinhalt;
    float m_verbrauch;
};

Auto::Auto(int tankgroesse, float tankinhalt, float verbrauch):
    m_tankgroesse(tankgroesse),
    m_tankinhalt(tankinhalt),
    m_verbrauch(verbrauch)
    {}

void Auto::info()const{
    std::cout << "In den Tank passen " << m_tankgroesse << " Liter Treibstoff.\n";
    std::cout << "Aktuell sind noch " << m_tankinhalt << " Liter im Tank.\n";
    std::cout << "Der Wagen verbraucht " << m_verbrauch << " Liter pro 100km.\n";
    std::cout << std::endl;
}

bool Auto::fahren(int km){
    std::cout << "Fahre " << km << "km.\n";
    m_tankinhalt -= m_verbrauch*km/100;

    if(m_tankinhalt < 0.0f){
        m_tankinhalt = 0.0f;

        std::cout << "Mit dem aktuellen Tankinhalt schaffen Sie die Fahrt leider nicht.\n";
        std::cout << "Der Wagen ist unterwegs liegengeblieben, Zeit zu tanken!\n";
    }

    std::cout << std::endl;
}

void Auto::tanken(float liter){
    std::cout << "Tanke " << liter << " Liter.\n";
    m_tankinhalt += liter;

    if(m_tankinhalt > m_tankgroesse){
        m_tankinhalt = m_tankgroesse;

        std::cout << "Nicht so übereifrig! Ihr Tank ist jetzt wieder voll.\n";
        std::cout << "Sie haben aber einiges daneben gegossen!\n";
    }

    std::cout << std::endl;
}

Diese Klasse demonstriert vieles, was Sie im Laufe dieses Abschnittes noch kennenlernen werden. Für den Moment sollten Sie wissen, dass diese Klasse 3 verschiedene Daten beinhaltet. Diese Daten sind die 3 Variablen deren Namen mit m_ beginnen. Vier Funktionen arbeiten auf diesen Daten.

Das m_ steht für Member oder Mitglied, es ist allerdings lediglich eine Möglichkeit, eine Variable als Mitglied einer Klasse zu kennzeichnen. Innerhalb einer Klassenfunktion kann man so schnell erkennen, welche Variablen Membervariablen sind und welche Parameter oder lokale Variablen. Eine Membervariable kann auch jeden anderen gültigen Variablennamen haben. Klassenfunktionen werden auch oft als Memberfunktionen oder schlicht als Methoden bezeichnet. Im Nachfolgendem wird hierfür immer der Begriff „Methode“ verwendet.

Sie haben nun gesehen, wie die Klasse aufgebaut ist, und in den folgenden Kapiteln wird dieser Aufbau genauer erläutert. Jetzt sollen Sie jedoch erst einmal den Vorteil einer Klasse verstehen, denn um eine Klasse zu benutzen, müssen Sie keine Ahnung haben, wie diese Klasse intern funktioniert.

Crystal Clear app terminal.png
int main(){
    Auto wagen(80, 60.0f, 5.7);

    wagen.info();

    wagen.tanken(12.4f);
    wagen.info();

    wagen.fahren(230);
    wagen.info();

    wagen.fahren(12200);
    wagen.info();

    wagen.tanken(99.0f);
    wagen.info();
}
Crystal Clear app kscreensaver.png
Ausgabe:
In den Tank passen 80 Liter Treibstoff.
Aktuell sind noch 60 Liter im Tank.
Der Wagen verbraucht 5.7 Liter pro 100km.

Tanke 12.4 Liter.

In den Tank passen 80 Liter Treibstoff.
Aktuell sind noch 72.4 Liter im Tank.
Der Wagen verbraucht 5.7 Liter pro 100km.

Fahre 230km.

In den Tank passen 80 Liter Treibstoff.
Aktuell sind noch 59.29 Liter im Tank.
Der Wagen verbraucht 5.7 Liter pro 100km.

Fahre 12200km.
Mit dem aktuellen Tankinhalt schaffen Sie die Fahrt leider nicht.
Der Wagen ist unterwegs liegengeblieben, Zeit zu tanken!

In den Tank passen 80 Liter Treibstoff.
Aktuell sind noch 0 Liter im Tank.
Der Wagen verbraucht 5.7 Liter pro 100km.

Tanke 99 Liter.
Nicht so übereifrig! Ihr Tank ist jetzt wieder voll.
Sie haben aber einiges daneben gegossen!

In den Tank passen 80 Liter Treibstoff.
Aktuell sind noch 80 Liter im Tank.
Der Wagen verbraucht 5.7 Liter pro 100km.

In der ersten Zeile von main() wird ein Auto-Objekt mit dem Namen wagen erstellt. Anschließend werden Methoden dieses Objekts aufgerufen, um die Daten darin zu verwalten. Von den Daten innerhalb des Objekts kriegen Sie beim Arbeiten mit dem Objekt überhaupt nichts mit. Lediglich die Ausgabe verrät, dass die drei Methoden untereinander über diese Daten „kommunizieren“.

Die vierte Methode (jene, die mit dem Klassennamen identisch ist) wird übrigens auch aufgerufen. Gleich in der ersten Zeile von main() wird diese Methode genutzt, um das Objekt zu erstellen. Daher bezeichnet man diese Methode auch als „Konstruktor“, dazu aber später mehr.


Persönliche Werkzeuge