Składnia deklaracji elementu członkowskiego klasy
Elementy członkowskie danych klasy i elementy członkowskie funkcji są w ogólności deklarowane zgodnie z regułami dla deklaracji. Składają się one (w następującej kolejności) z:
Specyfikatorów deklaracji. W klasach, specyfikatory static i mutable klasy magazynu są dozwolone dla elementów członkowskich danych. Kwalifikatory cv const i volatile są dozwolone dla elementów członkowskich danych i funkcji. Specyfikatory deklaracji friend, static, virtual i inline są dozwolone dla funkcji, mimo że friend wskazuje funkcję nie będącą elementem członkowskim.
Deklaratorów bez inicjatorów. W przypadku funkcji wirtualnych, czysty specyfikator postaci = 0 jest używany po deklaratorze funkcji do określenia czystej funkcji wirtualnej (funkcji wirtualnej bez implementacji w tej klasie).
Opcjonalnych pól bitowych. Zobacz Pola bitowe.
LUB
- Definicje funkcji. Definicja funkcji może być zawarta w klasie. Jeśli funkcja członkowska jest tak zdefiniowana, jest automatycznie uważana za wbudowaną.
LUB
- Szablony członkowskie (zobacz uwagi dotyczące szablonów członkowskich języka C++ w Elementy członkowskie szablonów klas).
Dane elementu członkowskiego nie mogą być zadeklarowane jako klasa magazynu auto, extern lub register.Jednakże mogą być zadeklarowane tak, aby posiadały klasę magazynu static.
Po zadeklarowaniu klasy friend na liście elementów członkowskich, można pominąć listę deklaratorów elementów członkowskich.Aby uzyskać więcej informacji o elementach zaprzyjaźnionych, zobacz Specyfikator friend i Elementy zaprzyjaźnione.Nawet jeśli nie wprowadzono nazwy klasy, może ona być wykorzystana w deklaracji friend.Deklaracja friend wprowadza nazwę.Jednakże w deklaracjach elementów członkowskich dla takich klas należy korzystać z rozwiniętej składni specyfikatora typu, jak pokazano na poniższym przykładzie:
// class_member_declaration_syntax.cpp
// compile with: /c
struct HasFriends {
friend class NotDeclaredYet;
};
W poprzednim przykładzie nie istnieje żadna lista deklaratorów elementów członkowskich po deklaracji klasy.Ponieważ deklaracja dla NotDeclaredYet nie została jeszcze przetworzona, użyto rozszerzonej postaci specyfikatora typu: class NotDeclaredYet.Typ, który został zadeklarowany, można określić w deklaracji elementu członkowskiego friend, używając zwykłego specyfikatora typu:
// class_member_declaration_syntax2.cpp
// compile with: /c
struct AlreadyDeclared {};
struct HasFriends {
friend AlreadyDeclared;
};
Czysty specyfikator (pokazany w poniższym przykładzie) wskazuje, że nie dostarczono żadnej implementacji dla deklarowanej funkcji wirtualnej.W związku z tym, czysty specyfikator może być określony jedynie dla funkcji wirtualnych.Rozważmy następujący przykład:
// 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;
};
W poprzednim kodzie zadeklarowano podstawową klasę abstrakcyjną - to znaczy, klasę zaprojektowaną do użycia tylko w ramach klasy podstawowej dla bardziej szczegółowych klas.Takie klasy podstawowe mogą wymusić określony protokół lub zestaw funkcji, deklarując jedną lub więcej funkcji wirtualnych jako "czyste" funkcje wirtualne przy użyciu czystego specyfikatora.
Klasy, które dziedziczą z klasy StrBase muszą dostarczać implementacji dla czystych funkcji wirtualnych; w przeciwnym razie są one także postrzegane jako abstrakcyjne klasy podstawowe.
Abstrakcyjne klasy podstawowe nie mogą być wykorzystywane do deklarowania obiektów.Na przykład, zanim obiekt typu dziedziczącego z StrBase będzie mógł być zadeklarowany, należy zaimplementować funkcje IsLessThan, IsEqualTo, CopyOf. (Aby uzyskać więcej informacji dotyczących abstrakcyjnych klas podstawowych, zobacz Klasy abstrakcyjne).