Member access operators
Greift auf ein Mitglied seines Operanden zu.
| Operatorname | Syntax | Über lade bar | Prototypbeispiele (für class T ) | |
|---|---|---|---|---|
| Innerhalb der Klassendefinition | Außerhalb der Klassendefinition | |||
| Indexoperator | a [ b ] | Ja | R & T :: operator [ ] ( S b ) ; | N/A |
| a [ ... ] (seit C++23) | R & T :: operator [ ] ( ... ) ; | |||
| Dereferenzierung | * a | Ja | R & T :: operator * ( ) ; | R & operator * ( T a ) ; |
| Adressoperator | & a | Ja | R * T :: operator & ( ) ; | R * operator & ( T a ) ; |
| Elementzugriff (Objekt) | a. b | Nein | N/A | N/A |
| Elementzugriff (Zeiger) | a - > b | Ja | R * T :: operator - > ( ) ; | N/A |
| Zeiger-auf-Element (Objekt) | a. * b | Nein | N/A | N/A |
| Zeiger-auf-Element (Zeiger) | a - > * b | Ja | R & T :: operator - > * ( S b ) ; | R & operator - > * ( T a, S b ) ; |
|
||||
Inhaltsverzeichnis |
Erklärung
Der eingebaute Subscript-Operator ermöglicht den Zugriff auf ein Objekt, auf das der Pointer - oder Array -Operand zeigt.
Der eingebaute Indirektionsoperator ermöglicht den Zugriff auf ein Objekt oder eine Funktion, auf die der Zeigeroperand zeigt.
Der eingebaute address-of Operator erzeugt einen Zeiger, der auf das Objekt oder die Funktion des Operanden zeigt.
Member of object und pointer to member of object Operatoren ermöglichen den Zugriff auf ein Datenelement oder eine Memberfunktion des Objektoperanden.
Eingebaute Zeiger-auf-Mitglied und Zeiger-auf-Mitglied-eines-Zeigers Operatoren ermöglichen den Zugriff auf ein Datenelement oder eine Memberfunktion der Klasse, auf die der Zeigeroperand zeigt.
Eingebauter Subskript-Operator
Die Indexoperatorausdrücke haben die Form
expr1
[
expr2
]
|
(1) | ||||||||
expr1
[{
expr
, ...
}]
|
(2) | (seit C++11) | |||||||
expr1
[
expr2
,
expr
, ...
]
|
(3) | (seit C++23) | |||||||
T
" oder ein Prvalue vom Typ "Zeiger auf
T
" sein, während der andere Ausdruck (
expr2
oder
expr1
, entsprechend) ein Prvalue von unscoped Enumeration oder integralem Typ sein muss. Das Ergebnis dieses Ausdrucks hat den Typ
T
.
expr2
darf kein ungeklammerter
Komma-Ausdruck
sein.
(seit C++23)
Der eingebaute Indexausdruck E1 [ E2 ] ist exakt identisch mit dem Ausdruck * ( E1 + E2 ) abgesehen von seiner Wertkategorie (siehe unten) und der Auswertungsreihenfolge (seit C++17) : Der Zeigeroperand (der das Ergebnis einer Array-zu-Zeiger-Konvertierung sein kann und auf ein Element eines Arrays oder auf das Element nach dem Ende zeigen muss) wird angepasst, um auf ein anderes Element desselben Arrays zu zeigen, gemäß den Regeln der Zeigerarithmetik , und wird dann dereferenziert.
Wenn auf ein Array angewendet, ist der Indexausdruck ein lvalue wenn das Array ein lvalue ist, und ein xvalue wenn es keiner ist (since C++11) .
Wenn auf einen Zeiger angewendet, ist der Subskriptausdruck immer ein Lvalue.
Der Typ
T
darf kein
unvollständiger Typ
sein, selbst wenn die Größe oder interne Struktur von
T
niemals verwendet wird, wie in
&
x
[
0
]
.
|
Die Verwendung eines nicht in Klammern gesetzten Komma-Ausdrucks als zweites (rechtes) Argument eines Subskript-Operators ist veraltet. Beispielsweise ist a [ b, c ] veraltet, während a [ ( b, c ) ] nicht veraltet ist. |
(seit C++20)
(bis C++23) |
|
Ein nicht in Klammern gesetzter Komma-Ausdruck kann nicht als zweites (rechtes) Argument eines Subskript-Operators verwendet werden. Beispielsweise ist a [ b, c ] entweder fehlerhaft oder äquivalent zu a. operator [ ] ( b, c ) . Klammern sind erforderlich, um einen Komma-Ausdruck als Subskript zu verwenden, z.B. a [ ( b, c ) ] . |
(seit C++23) |
Bei
Überladungsauflösung für benutzerdefinierte Operatoren
nimmt für jeden Objekttyp
T
(möglicherweise cv-qualifiziert) die folgende Funktionssignatur an der Überladungsauflösung teil:
|
T
&
operator
[
]
(
T
*
,
std::
ptrdiff_t
)
;
|
||
|
T
&
operator
[
]
(
std::
ptrdiff_t
, T
*
)
;
|
||
#include <iostream> #include <map> #include <string> int main() { int a[4] = {1, 2, 3, 4}; int* p = &a[2]; std::cout << p[1] << p[-1] << 1[p] << (-1)[p] << '\n'; std::map<std::pair<int, int>, std::string> m; m[{1, 2}] = "abc"; // verwendet die [{...}] Version }
Ausgabe:
4242
Eingebauter Indirektionsoperator
Die Dereferenzierungsoperator-Ausdrücke haben die Form
*
Ausdruck
|
|||||||||
Der Operand des eingebauten Dereferenzierungsoperators muss ein Zeiger auf ein Objekt oder ein Zeiger auf eine Funktion sein, und das Ergebnis ist der Lvalue, der sich auf das Objekt oder die Funktion bezieht, auf die
expr
zeigt. Wenn
expr
nicht tatsächlich auf ein Objekt oder eine Funktion zeigt, ist das Verhalten undefiniert (mit Ausnahme des durch
typeid
spezifizierten Falls).
Ein Zeiger auf (möglicherweise cv -qualifizierten) void kann nicht dereferenziert werden. Zeiger auf andere unvollständige Typen können dereferenziert werden, aber der resultierende L-Wert kann nur in Kontexten verwendet werden, die einen L-Wert eines unvollständigen Typs erlauben, z.B. bei der Initialisierung einer Referenz.
Bei
Überlagerungsauflösung für benutzerdefinierte Operatoren
nimmt für jeden Typ
T
, der entweder ein Objekttyp (möglicherweise cv-qualifiziert) oder ein Funktionstyp (nicht const- oder ref-qualifiziert) ist, die folgende Funktionssignatur an der Überlagerungsauflösung teil:
|
T
&
operator
*
(
T
*
)
;
|
||
#include <iostream> int f() { return 42; } int main() { int n = 1; int* pn = &n; int& r = *pn; // Lvalue kann an eine Referenz gebunden werden int m = *pn; // Indirektion + Lvalue-zu-Rvalue-Konvertierung int (*fp)() = &f; int (&fr)() = *fp; // Funktions-Lvalue kann an eine Referenz gebunden werden [](...){}(r, m, fr); // entfernt mögliche "unbenutzte Variable"-Warnungen }
Eingebauter Adressoperator
Die Adressoperator-Ausdrücke haben die Form
&
expr
|
(1) | ||||||||
&
class
::
member
|
(2) | ||||||||
T
ist,
operator&
erzeugt und liefert einen Prvalue vom Typ
T*
mit derselben CV-Qualifikation, der auf das durch den Operanden bezeichnete Objekt oder die Funktion zeigt. Wenn der Operand einen unvollständigen Typ hat, kann der Zeiger gebildet werden, aber falls dieser unvollständige Typ zufällig eine Klasse ist, die ihren eigenen
operator
&
definiert, ist es nicht spezifiziert, ob der eingebaute oder der überladene Operator verwendet wird. Für Operanden von Typen mit benutzerdefiniertem
operator
&
kann
std::addressof
verwendet werden, um den echten Zeiger zu erhalten.
Zu beachten ist, dass es im Gegensatz zu C99 und späteren C-Versionen keinen Sonderfall für den unären
operator
&
gibt, der auf das Ergebnis des unären
operator
*
angewendet wird.
|
Wenn
expr
eine
explizite Objekt-Memberfunktion
benennt,
muss
expr
ein
qualifizierter Bezeichner
sein. Die Anwendung von
|
(since C++23) |
T
in der Klasse
C
. Beachten Sie, dass weder
&
member
noch
C
::
member
noch sogar
&
(
C
::
member
)
zur Initialisierung eines Zeigers auf Member verwendet werden können.
Bei Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren führt dieser Operator keine zusätzlichen Funktionssignaturen ein: Der eingebaute Adressoperator kommt nicht zur Anwendung, falls eine überladene operator & existiert, die eine geeignete Funktion darstellt.
void f(int) {} void f(double) {} struct A { int i; }; struct B { void f(); }; int main() { int n = 1; int* pn = &n; // Zeiger int* pn2 = &*pn; // pn2 == pn int A::* mp = &A::i; // Zeiger auf Datenelement void (B::*mpf)() = &B::f; // Zeiger auf Memberfunktion void (*pf)(int) = &f; // Überladungsauflösung durch Initialisierungskontext // auto pf2 = &f; // Fehler: mehrdeutiger überladener Funktionstyp auto pf2 = static_cast<void (*)(int)>(&f); // Überladungsauflösung durch Cast }
Eingebaute Member-Zugriffsoperatoren
Die Memberzugriffsoperatorausdrücke haben die Form
expr
.template
(optional)
id-expr
|
(1) | ||||||||
expr
->template
(optional)
id-expr
|
(2) | ||||||||
expr
.
Pseudo-Destruktor
|
(3) | ||||||||
expr
->
Pseudo-Destruktor
|
(4) | ||||||||
T*
sein.
id-expr
ist ein Name (formal ein
Identifikatorausdruck
, der benennt) eines Datenelements oder einer Memberfunktion von
T
oder einer eindeutigen und zugänglichen Basisklasse
B
von
T
(z.B.
E1.
E2
oder
E1
-
>
E2
), optional
qualifiziert
(z.B.
E1.
B
::
E2
oder
E1
-
>
B
::
E2
), optional unter Verwendung des
template
Disambiguators
(z.B.
E1.
template
E2
oder
E1
-
>
template
E2
).
Wenn ein benutzerdefinierter operator - > aufgerufen wird, wird operator - > rekursiv erneut auf den resultierenden Wert angewendet, bis ein operator - > erreicht wird, der einen einfachen Zeiger zurückgibt. Danach werden die integrierten Semantiken auf diesen Zeiger angewendet.
Der Ausdruck E1 - > E2 ist exakt äquivalent zu ( * E1 ) . E2 für eingebaute Typen; deshalb behandeln die folgenden Regeln nur E1. E2 .
Im Ausdruck E1. E2 :
-
Wenn
E2
vom Referenztyp
T&oderT&&(since C++11) ist, ist das Ergebnis ein L-Wert vom TypT, der das Objekt oder die Funktion bezeichnet, an die die Referenz gebunden ist. -
Andernfalls, bei gegebenem Typ von
E2
als
T, ist das Ergebnis ein L-Wert vom TypT, der diesen static data member bezeichnet.
-
Wenn
E2
vom Referenztyp
T&oderT&&(seit C++11) ist, dann ist das Ergebnis ein Lvalue vom TypT, der das Objekt oder die Funktion bezeichnet, an die das entsprechende Referenzmitglied von E1 gebunden ist. - Andernfalls, wenn E1 ein Lvalue ist, dann ist das Ergebnis ein Lvalue, der dieses nicht-statische Datenelement von E1 bezeichnet.
- Andernfalls (wenn E1 ein Rvalue (bis C++17) Xvalue (der aus einem Prvalue materialisiert werden kann) (seit C++17) ist), dann ist das Ergebnis ein Rvalue (bis C++11) Xvalue (seit C++11) , der dieses nicht-statische Datenelement von E1 bezeichnet.
- Falls E2 eine statische Memberfunktion ist, ist das Ergebnis ein L-Wert, der diese statische Memberfunktion bezeichnet. Im Wesentlichen wird E1 in diesem Fall ausgewertet und verworfen.
- Andernfalls ( E2 ist eine nicht-statische Memberfunktion ), ist das Ergebnis ein PR-Wert, der diese nicht-statische Memberfunktion von E1 bezeichnet.
T
das Ergebnis als
ein R-Wert
(bis C++11)
ein PR-Wert
(seit C++11)
vom Typ
T
, dessen Wert dem Wert des Enumerators entspricht.
~
gefolgt vom
Typnamen
oder
decltype-Spezifizierer
ist, der denselben Typ (ohne CV-Qualifizierungen) bezeichnet, optional
qualifiziert
, dann ist das Ergebnis eine spezielle Art von Prvalue, die nur als linkoperand eines Funktionsaufrufoperators verwendet werden kann und für keinen anderen Zweck
operator. kann nicht überladen werden, und für operator - > führt bei der Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren der eingebaute Operator keine zusätzlichen Funktionssignaturen ein: Der eingebaute operator - > kommt nicht zur Anwendung, wenn eine überladene operator - > existiert, die eine geeignete Funktion ist.
#include <cassert> #include <iostream> #include <memory> struct P { template<typename T> static T* ptr() { return new T; } }; template<typename T> struct A { A(int n): n(n) {} int n; static int sn; int f() { return 10 + n; } static int sf() { return 4; } class B {}; enum E {RED = 1, BLUE = 2}; void g() { typedef int U; // keyword template needed for a dependent template member int* p = T().template ptr<U>(); p->~U(); // U is int, calls int's pseudo destructor delete p; } }; template<> int A<P>::sn = 2; struct UPtrWrapper { std::unique_ptr<std::string> uPtr; std::unique_ptr<std::string>& operator->() { return uPtr; } }; int main() { A<P> a(1); std::cout << a.n << ' ' << a.sn << ' ' // A::sn also works << a.f() << ' ' << a.sf() << ' ' // A::sf() also works // << &a.f << ' ' // error: ill-formed if a.f is not the // left-hand operand of operator() // << a.B << ' ' // error: nested type not allowed << a.RED << ' '; // enumerator UPtrWrapper uPtrWrap{std::make_unique<std::string>("wrapped")}; assert(uPtrWrap->data() == uPtrWrap.operator->().operator->()->data()); }
Ausgabe:
1 2 11 4 1
Wenn E2 ein nicht-statisches Mitglied ist und das Ergebnis von E1 ein Objekt ist, dessen Typ nicht ähnlich zum Typ von E1 ist, ist das Verhalten undefiniert:
struct A { int i; }; struct B { int j; }; struct D : A, B {}; void f() { D d; static_cast<B&>(d).j; // OK, Objektausdruck bezeichnet das B-Subobjekt von d reinterpret_cast<B&>(d).j; // undefiniertes Verhalten }
Eingebaute Zeiger-auf-Member-Zugriffsoperatoren
Die Ausdrücke für den Elementzugriffsoperator über Zeiger auf Elemente haben die Form
lhs
.*
rhs
|
(1) | ||||||||
lhs
->*
rhs
|
(2) | ||||||||
T
sein.
T*
sein.
rhs
muss ein Rvalue vom Typ Zeiger auf Element (
Daten
oder
Funktion
) von
T
oder Zeiger auf Element einer eindeutigen und zugänglichen Basisklasse
B
von
T
sein.
Der Ausdruck E1 - > * E2 ist exakt äquivalent zu ( * E1 ) . * E2 für eingebaute Typen; deshalb behandeln die folgenden Regeln nur E1. * E2 .
Im Ausdruck E1. * E2 :
- falls E1 ein Lvalue ist, ist das Ergebnis ein Lvalue, das dieses Datenelement bezeichnet,
- andernfalls (falls E1 ein Rvalue (bis C++17) Xvalue (der aus einem Prvalue materialisiert werden kann) (seit C++17) ist), ist das Ergebnis ein Rvalue (bis C++11) Xvalue (seit C++11) , der dieses Datenelement bezeichnet;
&
zeigt, ist das Programm ill-formed
es sei denn, die Memberfunktion hat den CV-Qualifier
const
aber nicht
volatile
(seit C++20)
;
|
7)
wenn
E1
ein L-Wert ist und
E2
auf eine Elementfunktion mit Ref-Qualifier
&&
zeigt, ist das Programm fehlerhaft.
|
(since C++11) |
Bei
Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren
nimmt für jede Kombination von Typen
D
,
B
,
R
, wobei der Klassentyp
B
entweder dieselbe Klasse wie
D
oder eine eindeutige und zugängliche Basisklasse von
D
ist, und
R
entweder ein Objekt- oder Funktionstyp ist, die folgende Funktionssignatur an der Überlagerungsauflösung teil:
|
R
&
operator
-
>
*
(
D
*
, R B
::
*
)
;
|
||
wobei beide Operanden cv-qualifiziert sein können, in welchem Fall die cv-Qualifikation des Rückgabetyps die Vereinigung der cv-Qualifikation der Operanden ist.
#include <iostream> struct S { S(int n) : mi(n) {} mutable int mi; int f(int n) { return mi + n; } }; struct D : public S { D(int n) : S(n) {} }; int main() { int S::* pmi = &S::mi; int (S::* pf)(int) = &S::f; const S s(7); // s.*pmi = 10; // error: cannot modify through mutable std::cout << s.*pmi << '\n'; D d(7); // base pointers work with derived object D* pd = &d; std::cout << (d.*pf)(7) << ' ' << (pd->*pf)(8) << '\n'; }
Ausgabe:
7 14 15
Standardbibliothek
Der Subscript-Operator wird von vielen Standard-Containerklassen überladen:
|
greift auf spezifisches Bit zu
(öffentliche Elementfunktion von
std::bitset<N>
)
|
|
|
bietet indizierten Zugriff auf das verwaltete Array
(öffentliche Elementfunktion von
std::unique_ptr<T,Deleter>
)
|
|
|
greift auf das spezifizierte Zeichen zu
(öffentliche Elementfunktion von
std::basic_string<CharT,Traits,Allocator>
)
|
|
|
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von
std::array<T,N>
)
|
|
|
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von
std::deque<T,Allocator>
)
|
|
|
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von
std::vector<T,Allocator>
)
|
|
|
greift auf spezifiziertes Element zu oder fügt es ein
(öffentliche Elementfunktion von
std::map<Key,T,Compare,Allocator>
)
|
|
|
greift auf spezifiziertes Element zu oder fügt es ein
(öffentliche Elementfunktion von
std::unordered_map<Key,T,Hash,KeyEqual,Allocator>
)
|
|
|
greift auf ein Element per Index zu
(öffentliche Elementfunktion von
std::reverse_iterator<Iter>
)
|
|
|
greift auf ein Element per Index zu
(öffentliche Elementfunktion von
std::move_iterator<Iter>
)
|
|
|
ruft Valarray-Element, -Slice oder -Maske ab/legt es fest
(öffentliche Elementfunktion von
std::valarray<T>
)
|
|
|
gibt spezifizierten Sub-Match zurück
(öffentliche Elementfunktion von
std::match_results<BidirIt,Alloc>
)
|
Der Indirektions- und Mitgliedsoperator wird von vielen Iteratoren und Smart-Pointer-Klassen überladen:
|
dereferenziert den Zeiger auf das verwaltete Objekt
(öffentliche Elementfunktion von
std::unique_ptr<T,Deleter>
)
|
|
|
dereferenziert den gespeicherten Zeiger
(öffentliche Elementfunktion von
std::shared_ptr<T>
)
|
|
|
greift auf das verwaltete Objekt zu
(öffentliche Elementfunktion von
std::auto_ptr<T>
)
|
|
|
dereferenziert den Iterator
(öffentliche Elementfunktion von
std::raw_storage_iterator<OutputIt,T>
)
|
|
|
dereferenziert den dekrementierten zugrundeliegenden Iterator
(öffentliche Elementfunktion von
std::reverse_iterator<Iter>
)
|
|
|
No-Op
(öffentliche Elementfunktion von
std::back_insert_iterator<Container>
)
|
|
|
No-Op
(öffentliche Elementfunktion von
std::front_insert_iterator<Container>
)
|
|
|
No-Op
(öffentliche Elementfunktion von
std::insert_iterator<Container>
)
|
|
|
greift auf das referenzierte Element zu
(öffentliche Elementfunktion von
std::move_iterator<Iter>
)
|
|
|
gibt das aktuelle Element zurück
(öffentliche Elementfunktion von
std::istream_iterator<T,CharT,Traits,Distance>
)
|
|
|
No-Op
(öffentliche Elementfunktion von
std::ostream_iterator<T,CharT,Traits>
)
|
|
|
erhält eine Kopie des aktuellen Zeichens
(öffentliche Elementfunktion von
std::istreambuf_iterator<CharT,Traits>
)
|
|
|
No-Op
(öffentliche Elementfunktion von
std::ostreambuf_iterator<CharT,Traits>
)
|
|
|
greift auf die aktuelle Übereinstimmung zu
(öffentliche Elementfunktion von
std::regex_iterator<BidirIt,CharT,Traits>
)
|
|
|
greift auf aktuelle Teilübereinstimmung zu
(öffentliche Elementfunktion von
std::regex_token_iterator<BidirIt,CharT,Traits>
)
|
Keine Klassen der Standardbibliothek überladen
operator
&
. Das bekannteste Beispiel für überladenen
operator
&
ist die Microsoft COM-Klasse
CComPtr
, obwohl er auch in EDSLs wie
boost.spirit
vorkommen kann.
Keine Standardbibliotheksklassen überladen operator - > * . Es wurde vorgeschlagen, dass es Teil der Smart-Pointer-Schnittstelle sein könnte, und tatsächlich wird es in dieser Funktion von Aktoren in boost.phoenix verwendet, ist jedoch häufiger in EDSLs wie cpp.react zu finden.
Hinweise
| Feature-Test-Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_multidimensional_subscript
|
202110L
|
(C++23) | Mehrdimensionaler Subscript-Operator |
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 1213 | C++11 | Indizierung eines Array-Rvalues ergab Lvalue | als Xvalue neu klassifiziert |
| CWG 1458 | C++98 |
Anwendung von
&
auf einen Lvalue eines unvollständigen Klassentyps, der
operator & deklariert, führte zu undefiniertem Verhalten |
es ist nicht spezifiziert,
welches & verwendet wird |
| CWG 1642 | C++98 | die rechte Seite in eingebauten Zeiger-auf-Mitglied-Zugriffsoperatoren konnte ein Lvalue sein | kann nur ein Rvalue sein |
| CWG 1800 | C++98 |
bei Anwendung von
&
auf ein nicht-statisches Datenelement einer
anonymen Union war unklar, ob die anonyme Union am Ergebnistyp teilnimmt |
die anonyme Union
ist nicht im Ergebnistyp enthalten |
| CWG 2614 | C++98 | das Ergebnis von E1. E2 war unklar, wenn E2 ein Referenzmitglied oder Enumerator ist | klargestellt |
| CWG 2725 | C++98 |
wenn
E2
eine statische Memberfunktion ist, ist
E1.
E2
wohlgeformt
selbst wenn es nicht der linke Operand von operator ( ) ist |
E1.
E2
ist in diesem Fall
fehlerhaft |
| CWG 2748 | C++98 |
das Verhalten von
E1
-
>
E2
war unklar, wenn
E1
ein
Nullzeiger ist und E2 auf ein statisches Mitglied verweist |
das Verhalten ist
in diesem Fall undefiniert |
| CWG 2813 | C++98 |
E1
war kein verworfenes Wertexpression, wenn
E1. E2 ein statisches Mitglied oder Enumeration benennt |
ist es |
| CWG 2823 | C++98 |
das Verhalten von
*
expr
war unklar, wenn
expr
nicht auf ein Objekt oder eine Funktion zeigt |
klargestellt |
Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung |
Inkrement
Dekrement |
Arithmetisch | Logisch | Vergleich |
Member-Zugriff
Zugriff |
Sonstige |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
Funktionsaufruf
a ( ... ) |
|
Komma
a, b |
||||||
|
Bedingt
a ? b : c |
||||||
| Spezielle Operatoren | ||||||
|
static_cast
konvertiert einen Typ in einen anderen verwandten Typ
|
||||||
|
C-Dokumentation
für
Memberzugriffsoperatoren
|