Freigeben über


Class-Member-Deklarationssyntax

Klassendatenmember und Funktionsmember werden im Allgemeinen nach den Regeln für Deklarationen deklariert. Sie bestehen aus (in der folgenden Reihenfolge):

  • Deklarationsspezifizierern. In Klassen sind die Speicherklassenspezifizierer static und mutable für Datenmember zulässig. Die cv-Qualifizierer const und volatile sind für Daten- und Funktionsmember zulässig. Die Deklarationsspezifizierer friend, static, virtual und inline sind für Funktionen zulässig, obwohl friend eine Nichtmemberfunktion angibt.

  • Deklaratoren ohne Initialisierung. Im Fall der virtuellen Funktionen wird der reine Spezifizierer der Form = 0 nach dem Funktionsdeklarator verwendet, um eine rein virtuelle Funktion (eine virtuelle Funktion ohne eine Implementierung in dieser Klasse) anzugeben.

  • Bitfeldern (optional). Weitere Informationen erhalten Sie unter Bitfelder.

OR

  • Funktionsdefinitionen. Die Definition einer Funktion kann in die Klasse eingefügt werden. Wenn eine Memberfunktion so definiert wird, gilt sie automatisch als inline.

OR

Memberdaten können nicht als auto-, extern- oder register-Speicherklasse deklariert werden. Sie können jedoch als static-Speicherklasse habend deklariert werden.

Wenn Sie eine friend-Klasse in einer Memberliste deklarieren, können Sie die Memberdeklarationsliste weglassen. Weitere Informationen zu Friends finden Sie unter Friend-Spezifizierer und Friends. Auch wenn ein Klassenname nicht eingeführt wurde, kann er in einer friend-Deklaration verwendet werden. In dieser friend-Deklaration wird der Name eingeführt. In den Memberdeklarationen für solche Klassen muss die ausführliche Typspezifizierersyntax verwendet werden, wie im folgenden Beispiel gezeigt:

// class_member_declaration_syntax.cpp
// compile with: /c
struct HasFriends {
   friend class NotDeclaredYet;
};

Im vorherigen Beispiel gibt es keine Memberdeklaratorliste nach der Klassendeklaration. Da die Deklaration für NotDeclaredYet noch nicht verarbeitet worden ist, wird das ausführliche Typspezifiziererformular verwendet: class NotDeclaredYet. Ein Typ, der deklariert wurde, kann in einer friend-Memberdeklaration mit einem normalen Typspezifizierer angegeben werden:

// class_member_declaration_syntax2.cpp
// compile with: /c
struct AlreadyDeclared {};

struct HasFriends {
   friend AlreadyDeclared;
};

Der reine Spezifizierer (im folgenden Beispiel gezeigt) gibt an, dass keine Implementierung für die deklarierte virtuelle Funktion angegeben ist. Daher kann der reine Spezifizierer nur für virtuelle Funktionen angegeben werden. Betrachten Sie das folgende Beispiel:

// class_member_declaration_syntax3.cpp
// compile with: /c
class StrBase {   // Base class for strings.
public:
   virtual int IsLessThan( StrBase& ) = 0;
   virtual int IsEqualTo( StrBase& ) = 0;
   virtual StrBase& CopyOf( StrBase& ) = 0;
};

Der vorhergehende Code deklariert eine abstrakte Basisklasse, also eine Klasse, die nur als Basisklasse für spezifischere Klassen verwendet werden soll. Diese Basisklassen können ein bestimmtes Protokoll oder eine Gruppe von Funktionen erzwingen, indem sie eine oder mehrere virtuelle Funktionen als "rein" virtuelle Funktionen unter Verwendung des reinen Spezifizierers deklarieren.

Klassen, die von der StrBase-Klasse erben, müssen Implementierungen für die reinen virtuellen Funktionen bereitstellen, andernfalls werden sie auch als abstrakte Basisklassen angesehen.

Abstrakte Basisklassen können nicht verwendet werden, um Objekte zu deklarieren. Bevor beispielsweise ein Objekt eines Typs, der von StrBase geerbt wird, deklariert werden kann, müssen die Funktionen IsLessThan, IsEqualTo und CopyOf implementiert werden. (Weitere Informationen zu abstrakten Basisklassen finden Sie unter Abstrakte Klassen).

Siehe auch

Referenz

Klassenmember