Operatori in C e C++
Questa è una lista degli operatori nei linguaggi di programmazione C e C++. Tutti gli operatori elencati di seguito (eccetto typeof) esistono nel linguaggio C++, mentre in C solo quelli indicati nella colonna “Incluso in C”.
C++ include inoltre gli operatori type conversion (): const_cast
, static_cast
, dynamic_cast
, e reinterpret_cast
. La formattazione di questi operatori intende che il livello di precedenza è irrilevante.
Molti degli operatori disponibili in C e C++ sono implementabili anche in altri linguaggi della “C family”, quali C#, D, ma anche Java, Perl e PHP, con le medesime caratteristiche mostrate (precedenze, associatività e semantica).
Overloading degli operatori
C++ possiede molti operatori già predefiniti in grado di operare su vari tipi di dato, perciò si può parlare di “operatori già sovraccaricati”. Per esempio l’operatore +
può essere implementato per sommare sia due variabili di tipo int
(interi), sia due variabili di tipo float
o double
(variabili a virgola mobile).
Oltre a quando detto in precedenza, il programmatore può anche “estendere” l’operatività di ciascuno di essi; per esempio operandi complessi definiti con le classi, si potrebbero trattare anche come se fossero dati semplici.
In C++ è possibile sovraccaricare tutti gli operatori predifiniti, con l’eccezione su accesso al membro (.)
, indirezione di accesso al membro (.*)
e risoluzione di ambito (::)
.
Nel caso degli operatori, il numero degli operandi e la priorità dell’operatore sovraccaricato sono le stesse dell’operatore predefinito, mentre il nuovo operatore può essere definito come una funzione membro oppure come una funzione friend (funzione amica).
Tabella degli operatori
Nelle tabelle seguenti, a
, b
e c
rappresentano valori validi qualsiasi (literals, valori da variabili, oppure return value) o, in alcuni casi specifici, nomi di oggetti o lvalues. R
, S
e T
indicano qualsiasi tipo, mentre K
indica un tipo di classe o un tipo enum.
Operatori aritmetici
Tutti gli operatori aritmetici esistono sia in C e C++ e possono essere, come già indicato, sovraccaricati solo in C++.
Nome operatore | Sintassi | Esempi di implementazione in C++ | ||
---|---|---|---|---|
Come membro di una classe | Fuori dalla classe | |||
Addizione | a+b
|
R K::operator +(S b);
|
R operator +(K a, S b);
| |
Sottrazione | a-b
|
R K::operator -(S b);
|
R operator -(K a, S b);
| |
Unario più | +a
|
R K::operator +(); | R operator +(K a); | |
Unario meno | -a | R K::operator -(); | R operator -(K a); | |
Moltiplicazione | a * b
|
R K::operator *(S b);
|
R operator *(K a, S b);
| |
Divisione | a / b
|
R K::operator /(S b);
|
R operator /(K a, S b);
| |
Modulo | a % b
|
R K::operator %(S b);
|
R operator %(K a, S b);
| |
Incremento | Prefisso | ++a
|
R& K::operator ++();
|
R& operator ++(K& a);
|
Postfisso | a++
|
R K::operator ++(int);
|
R operator ++(K& a, int);
| |
Il C++ utilizza il parametro fittizio senza nome int per differenziare gli operatori di incremento prefisso e postfisso. | ||||
Decremento | Prefisso | --a
|
R& K::operator --();
|
R& operator --(K& a);
|
Postfisso | a--
|
R K::operator --(int);
|
R operator --(K& a, int);
| |
Il C++ utilizza il parametro fittizio senza nome int per differenziare gli operatori di incremento prefisso e postfisso. |
Operatori di confronto/operatori relazionali
Tutti gli operatori di confronto possono essere sovraccaricati solo in C++. Dal C++20, l'operatore di disuguaglianza viene generato automaticamente se viene definito operator==
e tutti e quattro gli operatori relazionali vengono generati automaticamente se viene definito operator<=>
.
Nome operatore | Sintassi | Incluso in C | Esempi di implementazione in C++ | |
---|---|---|---|---|
Come membro di una classe | Fuori dalla classe | |||
Uguale | width="8%" style="background:#9EFF9E; color:#000;" | Sì | bool K::operator ==(S const& b) const;
|
bool operator ==(K const& a, S const& b);
| |
Diverso | a != b |
Sì | bool K::operator !=(S const& b) const;
|
bool operator !=(K const& a, S const& b);
|
Maggiore di | a > b |
Sì | bool K::operator >(S const& b) const;
|
bool operator >(K const& a, S const& b);
|
Minore di | a < b |
Sì | bool K::operator <(S const& b) const;
|
bool operator <(K const& a, S const& b);
|
Maggiore o uguale a | a >= b |
Sì | bool K::operator >=(S const& b) const;
|
bool operator >=(K const& a, S const& b);
|
Minore o uguale a | a <= b |
Sì | bool K::operator <=(S const& b) const;
|
bool operator <=(K const& a, S const& b);
|
Operator name | Syntax | Included in C |
Prototype examples | ||
---|---|---|---|---|---|
As member of K | Outside class definitions | ||||
class="table-rh" colspan="2" Template:Rh width="23%" |Equal to | a == b
|
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Not equal to | a != b |
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Greater than | a > b |
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Less than | a < b |
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Greater than or equal to | a >= b |
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Less than or equal to | a <= b |
Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" rowspan="2" Template:Rh |Three-way comparison[a] | a <=> b |
No | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |The operator has a total of 3 possible return types: std::weak_ordering , std::strong_ordering and std::partial_ordering to which they all are convertible to.
|
Operatori logici
Tutti gli operatori logici esistono in C e C++ e possono essere sovraccaricati in C++, sebbene il sovraccarico dell'AND logico e dell'OR logico sia sconsigliato, perché come operatori sovraccaricati si comportano come normali chiamate di funzione, il che significa che entrambi i loro operandi vengono valutati, quindi perdono la loro proprietà di valutazione del cortocircuito, ben utilizzata e attesa. [1]
Nome dell'operatore | Sintassi | Esempi di prototipi C++ | ||
---|---|---|---|---|
Come membro di K | Definizioni di classe esterna | |||
class="table-rh" colspan="2" Template:Rh width="23%" | Negazione logica (NOT) | ! a
|
bool K :: operator ! (); | bool operator ! ( K a ); | |
class="table-rh" colspan="2" Template:Rh |Logico AND | a && b
|
bool K :: operator && ( S b ); | bool operator && ( K a , S b ); | |
class="table-rh" colspan="2" Template:Rh |Logico OR | a || b
|
bool K::operator ||(S b);
|
bool operator ||(K a, S b);
|
Operatori bit a bit
Tutti gli operatori bit a bit esistono in C e C++ e possono essere sovraccaricati in C++.
Operator name | Syntax | Prototype examples | ||
---|---|---|---|---|
As member of K | Outside class definitions | |||
class="table-rh" colspan="2" Template:Rh width="23%" |Bitwise NOT | ~a |
c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Bitwise AND | a & b
|
c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Bitwise OR | a | b
|
c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Bitwise XOR | a ^ b
|
c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Bitwise left shift[b] | a << b
|
c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Bitwise right shift[b]Template:Refn | a >> b
|
c.p.p. | c.p.p. |
Operatori di assegnazione
Tutte le espressioni di assegnazione esistono in C e C++ e possono essere sovraccaricate in C++.
Per gli operatori indicati, la semantica dell'espressione di assegnazione combinata incorporata a ⊚= b
è equivalente a a = a ⊚ b
, eccetto per il fatto che a
viene valutata una sola volta.
Operator name | Syntax | C++ prototype examples | |
---|---|---|---|
As member of K | Outside class definitions | ||
Direct assignment | a = b
|
c.p.p. | N.D. |
Addition assignment | a += b
|
c.p.p. | c.p.p. |
Subtraction assignment | a -= b
|
c.p.p. | c.p.p. |
Multiplication assignment | a *= b
|
c.p.p. | c.p.p. |
Division assignment | a /= b
|
c.p.p. | c.p.p. |
Modulo assignment | a %= b
|
c.p.p. | c.p.p. |
Bitwise AND assignment | a &= b
|
c.p.p. | c.p.p. |
Bitwise OR assignment | a |= b
|
c.p.p. | c.p.p. |
Bitwise XOR assignment | a ^= b
|
c.p.p. | c.p.p. |
Bitwise left shift assignment | a <<= b
|
c.p.p. | c.p.p. |
Bitwise right shift assignment | a >>= b
|
c.p.p. | c.p.p. |
Operatori membro e puntatore
Operator name | Syntax | Can overload in C++ | Included in C |
C++ prototype examples | ||
---|---|---|---|---|---|---|
As member of K | Outside class definitions | |||||
class="table-rh" colspan="2" Template:Rh width="23%" |Subscript | a[b]
|
Sì | Sì | c.p.p. c.p.p. |
N.D. | |
class="table-rh" colspan="2" Template:Rh |Indirection ("object pointed to by a") | *a |
Sì | Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Address-of ("address of a") | &a |
Sì[c] | Sì | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Structure dereference ("member b of object pointed to by a") | a->b |
Sì | Sì | c.p.p. |
N.D. | |
class="table-rh" colspan="2" Template:Rh |Structure reference ("member b of object a") | a.b |
No | Sì | Template:Rh colspan="2" style="background: #ececec; color: #2C2C2C; vertical-align: middle; text-align: center; " class="table-na" | N.D. | ||
class="table-rh" colspan="2" Template:Rh |Member selected by pointer-to-member b of object pointed to by a[d] | a->*b |
Sì | No | c.p.p. | c.p.p. | |
class="table-rh" colspan="2" Template:Rh |Member of object a selected by pointer-to-member b | a.*b |
No | No | Template:Rh colspan="2" style="background: #ececec; color: #2C2C2C; vertical-align: middle; text-align: center; " class="table-na" | N.D. |
[[Categoria:C++]] [[Categoria:C]]
- ^ Errore nelle note: Errore nell'uso del marcatore
<ref>
: non è stato indicato alcun testo per il marcatorethreewaycomparison
- ^ a b Errore nelle note: Errore nell'uso del marcatore
<ref>
: non è stato indicato alcun testo per il marcatorebitshift
- ^ Errore nelle note: Errore nell'uso del marcatore
<ref>
: non è stato indicato alcun testo per il marcatoreaddressof2
- ^ Errore nelle note: Errore nell'uso del marcatore
<ref>
: non è stato indicato alcun testo per il marcatorearrowstar
- ^ isocpp.org, https://isocpp.org/wiki/faq/operator-overloading .