C++-Programmierung/ Im Zusammenhang mit Klassen

Aus Wikibooks

Wechseln zu: Navigation, Suche
Im Zusammenhang mit Klassen

Zielgruppe:

Anfänger

Lernziel:
Weitere Schlüsselwörter in Zusammenhang mit Klassen: Strukturen, Unions, inline, static, mutable

Inhaltsverzeichnis

Nochmal Klassen

Neben den Klassen gibt es in C++ auch noch die aus C stammenden Strukturen. Eine Struktur, auch Datenverbund genannt, fasst mehrere Variablen zu einem Typ zusammen. Im Gegensatz zu den C-Strukturen sind C++-Strukturen allerdings vollständig kompatibel zu Klassen. Sie können in einer Struktur also problemlos Methoden deklarieren oder die Zugriffsrechte über die Schlüsselworte public, protected (wird später Erläutert) und private festlegen.

Der einzige wirkliche Unterschied zwischen Strukturen und Klassen ist in C++, das Klassen implizit private, während Strukturen implizit public sind. Da dieser impliziten Zugriffsrechtebereich aber für gewöhnlich nicht genutzt werden sollte, ist dieser Unterschied fast unbedeutend. Das folgende kleine Beispiel zeigt die Definition einer Struktur im vergleich zu der einer Klasse.

Crystal Clear app terminal.png
struct A{
    // öffentliche Member

public:
    // öffentliche Member

private:
    // private Member
};

class B{
    // private Member

public:
    // öffentliche Member

private:
    // private Member
};
Symbol move vote.svg
Thema wird später näher erläutert…
Im Kapitel über Vererbung werden Sie noch sehen, das Sie eine Klasse problemlos von einer Struktur ableiten können und umgekehrt.

Platzsparend – Eine Union

Eine Union ist eine Vereinigung verschiedener Typen auf einer Adresse. Dies erleichtert Redefinitionen oder die Verwendung von Variantentypen. Sie nimmt nicht mehrere Elemente nebeneinander auf, sondern zu jedem Zeitpunkt immer nur eines. Wird eine der Definitionsvarianten initialisiert, so werden die anderen damit implizit initialisiert, da sie auf der gleichen Adresse beginnen. Sie wird mit dem Schlüsselwort union deklariert:

Crystal Clear app terminal.png
union _Union1
{
  int a;
  float b;
  char[4] caC; // 32bit float/int angenommen
};

Beispiel zur Verwendung:

Crystal Clear app terminal.png
_Union1 u1;   // Instanz erzeugen
u1.a = 10;  // jetzt ist in u1 ein int gespeichert
u1.b = 2.5; // jetzt ein float
            // damit hat u1.a möglicherweise keinen sinnvollen Wert mehr
ofstream DateiStream("xxx.data");
DateiStream << u1.caC; // Damit wird der Dateninhalt als Rohdaten verwendet

Bei Einsatz von Datenstrukturen mit fester Ausrichtung und kann hilfs einer union die gesamte Datensammlung als Rohdaten aus dem Speicher betrachtet werden. Zum Beispiel mit einer anonymen union die eine Datensammlungsstruktur enthält und einen direkt ansprechbaren Zeiger auf deren Rohdaten.

Wir empfehlen inline

In den Kapiteln über Funktionen und Headerdateien haben Sie bereits einiges über inline-Funktionen erfahren. An dieser Stelle soll dieses Wissen nun auf den Gebrauch von inline-Klassenmethoden übertragen werden. Das folgende kleine Beispiel zeigt einer Klasse mit einer inline-Methode.

Crystal Clear app terminal.png
class A{
public:
    int methode()const;

private:
    int m_a;
};

inline int A::methode()const{
    return m_a;
}

Das Schlüsselwort inline steht vor der Methodendefinition. In der Deklaration würde es zwar keinen Compilierfehler produzieren, aber es würde, je nach Compiler, nur auf Verwendungen dieser Methode in der gleichen Implementierungsdatei Auswirkungen haben. Damit der Compiler den Methodenaufruf auch durch den Methodenrumpf ersetzen kann, steht die Methodendefinition ebenso die Klassendefinition in der Headerdatei und nicht in einer eventuell zugehörigen Implementierungsdatei. Diese Vorgehensweise ist nur sinnvoll, wenn die Methode sich später in der gleichen Binärdatei befindet. Wollen Sie sicherstellen, dass eine bestimmte Methode immer die Chance hat, inline verwendet zu werden, nehmen Sie folgendes Verfahren:

Wenn Sie eine Funktion direkt innerhalb einer Klassendefinition definieren, ist sie implizit inline, da solche Funktion nahezu immer sehr kurz sind und sich somit gut zum Inlinen eignen.

Crystal Clear app terminal.png
class A{
public:
    // methode ist implizit inline
    int methode()const { return m_a; }

private:
    int m_a;
};
Symbol kept vote.svg
Tipp

Moderne Compilersuiten sorgen je nach Einstellungen sowieso dafür, dass Methoden inline verwendet werden, auch wenn sie nicht als Inline deklariert wurden! Die meisten dieser Suiten ermöglichen Ihnen, auch die Inline-Verwendung durch weitere Schlüsselwörter wahrscheinlicher zu machen. Da die Inline-Verwendung eine freiwillige und willkürliche Entscheidung des Compilers ist und Einfluss auf das Laufzeitverhalten nimmt, sollte man nur in wenigen Fällen darauf Rücksicht nehmen. Diese Fälle sind nicht Inhalt dieses Buchs und wer denkt, dass er/sie schlauer als der verwendete Compiler/Linker ist, braucht dieses Buch auch nicht zu lesen.

Statische Membervariablen

Statische Inhalte einer Klasse sind im gleichen Ausführungsobjekt

  • in allen Instanzen dieser Klasse gleich.
  • auch verfügbar wenn keine Instanz der Klasse existiert.

Dies gilt auch für statische Mitgliedsvariablen.

Eine statische Variable wird mit dem Speicherklassenschlüsselwort static deklariert. Variablen der Speicherklasse static sind nur in dem Objektcode gültig in dem sie definiert sind. Um dieses Verhalten bei einer Mitgliedsvariable in einer Klasse zu erreichen, muss neben der Deklaration in der Klasse eine Definition dieser Variable im Ausführungsobjekt der Klasse, außerhalb der Deklaration, erfolgen. Bei konstanten, statischen Mitgliedsvariablen genügt die Deklaration, Definition und Initialisierung innerhalb der Klassendeklaration.

Crystal Clear app terminal.png
class mitStatischemInhalt
{
public:
        static int x;
};
int mitStatischemInhalt::x;

Die Klasse mitStatischemInhalt hat nun eine statische Mitgliedsvariable 'x', die in allen Instanzen der Klasse und auch ohne Instantiierung über mitStatischemInhalt::x erreichbar ist, und sich auf die eine Definition int mitStatischemInhalt::x; bezieht.

Symbol opinion vote.svg
Hinweis

Bitte beachten Sie bei diesem Vorgehen, dass die Speicherklasse static festlegt, dass die statischen Inhalte einer Klasse nur in dem Modul gültig sind, in dem sie definiert wurden. Ein externer Zugriff auf diese Variable ist nicht möglich.

Statische Methoden

Statische Inhalte einer Klasse sind im gleichen Ausführungsobjekt

  • in allen Instanzen dieser Klasse gleich.
  • auch verfügbar wenn keine Instanz der Klasse existiert.

Eine statische Methode wird mit dem Speicherklassenschlüsselwort static deklariert.

Dies gilt auch für statische Mitgliedsmethoden.

Im aktuellen Abschnitt ist mit statische Methode immer eine statische Mitglieds-Methode einer Klasse gemeint.

Statische Methoden können auf statische Mitglieder der Klasse in der sie deklariert werden zugreifen. Nicht-statische Inhalte dürfen nicht von der Methode aus verwendet werden, da die Methode auch ohne eine Instanz gültig ist. Auch wenn ein Objekt verwendet wird und über das Objekt die statische Methode aufgerufen wird, wird der statische Programmcode verwendet.

Im Beispiel wird nun eine statische Methode deklariert und in einer Beispielfunktion dreimal verwendet. Beachten Sie, das die Zuweisungen von p1,p2,p3 immer die gleiche statische Funktion aufrufen.

Crystal Clear app terminal.png
class Q
{
public:
  static char * gibVierKiloByte(void);
};

void f( Q & rQ, Q * pQ )
{
  char *p1 = Q::gibVierKiloByte(); // Aufruf ohne Objekt
  char *p2 = rQ.gibVierKiloByte(); // Aufruf über referenziertes Objekt
  char *p3 = pQ->gibVierKiloByte(); // Aufruf über Zeiger auf Objekt
};

static in Funktionen

Baustelle.svg

Dieses Kapitel ist leider noch nicht vorhanden…


Wenn Sie Lust haben können Sie das Kapitel static in Funktionen selbst schreiben oder einen Beitrag dazu leisten.

Nicht ganz konstant – mutable

Baustelle.svg

Dieses Kapitel ist leider noch nicht vorhanden…


Wenn Sie Lust haben können Sie das Kapitel Nicht ganz konstant – mutable selbst schreiben oder einen Beitrag dazu leisten.

Zusammenfassung

Baustelle.svg

Zu diesem Abschnitt existiert leider noch keine Zusammenfassung…


Wenn Sie Lust haben können Sie die Zusammenfassung zum Abschnitt Im Zusammenhang mit Klassen selbst schreiben oder einen Beitrag dazu leisten.


Persönliche Werkzeuge