C++-Deklaratoren (abstrakt)
Ein abstrakter Deklarator ist ein Deklarator, in dem der Bezeichner fehlt. (Weitere Informationen finden Sie unter Typnamen und Deklaratoren). Nicht abstrakte Deklaratoren werden in der Deklaration von Objekten oder Funktionen verwendet. Wird der Bezeichner weggelassen, bleiben nur die Typinformationen übrig. Daher kann ein Basistyp wie char mit abstrakten Deklaratoren geändert werden, um einen komplexeren Typ wie einen Zeiger auf Zeichen oder ein Zeichenarray anzugeben. Daher werden sie immer in Verbindung mit einem Basistypnamen verwendet und nur dann eingesetzt, wenn ein Zeiger, ein Array oder ein Referenztyp erforderlich ist (einschließlich eines Zeigers, mit dieser Basistyp zurückgegeben wird). In diesem Abschnitt werden die abstrakten Deklaratoren erläutert, die folgenden Kriterien entsprechen:
Ein abstrakter Deklarator ist ein Deklarator, der keinen Namen deklariert – der Bezeichner wird ausgelassen. Beispiel:
char *
gibt den Typ Zeiger auf den Typ char an. Der Typname besteht aus dem Basistypnamen char sowie dem abstrakten Deklarator *.
Entsprechend ist der abstrakte Deklarator für einen Verweis der &-Operator, und ein Arraytyp wird in Klammern angegeben. Jeder Typ kann angegeben werden, indem einfach die Syntax für den Deklarator angewendet und der Bezeichner entfernt wird.
char & // reference to char
char[5] // array of char
Nachfolgend wird eine etwas kompliziertere Verwendung eines abstrakten Deklarators beschrieben, der den Typ Zeiger auf eine Funktion deklariert, der zwei Argumente, beide vom Typ char *, akzeptiert und char * zurückgibt:
char * (*)( char *, char * )
In Kombination mit dem Basistypbezeichner deklarieren abstrakte Deklaratoren einen Typ vollständig. Die Typnamen, die mithilfe der abstrakten Deklaratoren erstellt werden, können überall dort verwendet werden, wo ein Typ erforderlich ist:
// Get the size of array of 10 pointers to type char.
size_t nSize = sizeof( char *[10] );
// cast fptr to pointer to function that takes two arguments, both of type
// pointer to char
i = (char * (*)(char*, char*)) fptr;
Der typedef-Bezeichner kann verwendet werden, damit die sperrige Syntax von abstrakten Deklaratoren nicht wiederholt werden muss.