Assegnazione semplice (C++)
L'operatore di assegnazione semplice (=) determina il valore del secondo operando per essere archiviato nell'oggetto specificato dal primo operando. Se entrambi gli oggetti sono di tipi aritmetici, l'operando di destra viene convertito nel tipo di sinistra, prima di archiviare il valore.
Gli oggetti dei tipi const e volatile possono essere assegnati ai valori l dei tipi unicamente volatili o che non sono né const né volatili.
L'assegnazione a oggetti di tipo di classe (tipi di struct, unione e classe) viene eseguita da una funzione denominata operator=. Il comportamento predefinito di questa funzione di operatore è di eseguire una copia bit per bit; tuttavia, questo comportamento può essere modificato mediante gli operatori di overload. (Vedere Operatori di overload per ulteriori informazioni).
Un oggetto senza alcuna ambiguità di classe derivata da una classe base specificata può essere assegnato a un oggetto della classe base. Il contrario non è consentito perché è presente una conversione implicita da classe derivata a classe base ma non da classe base a classe derivata. Di seguito è riportato un esempio.
// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
ABase() { cout << "constructing ABase\n"; }
};
class ADerived : public ABase
{
public:
ADerived() { cout << "constructing ADerived\n"; }
};
int main()
{
ABase aBase;
ADerived aDerived;
aBase = aDerived; // OK
aDerived = aBase; // C2679
}
Le assegnazioni ai tipi di riferimento si comportano come se l'assegnazione venisse effettuata all'oggetto cui punta il riferimento.
Per gli oggetti di tipo classe, l'assegnazione è diversa dall'inizializzazione. Per illustrare come possono essere diverse l'assegnazione e l'inizializzazione, si consideri il codice
UserType1 A;
UserType2 B = A;
Il codice precedente mostra un inizializzatore; chiama il costruttore per UserType2 che accetta un argomento di tipo UserType1. Dato il codice
UserType1 A;
UserType2 B;
B = A;
l'istruzione di assegnazione
B = A;
può avere uno dei seguenti effetti:
Chiamare la funzione di operatore= per UserType2, se l'operatore= viene fornito con un argomento UserType1.
Chiamare la funzione esplicita UserType1::operator UserType2 di conversione, se tale funzione non esiste.
Chiamare un costruttore UserType2::UserType2, se tale costruttore esiste, che accetta un argomento UserType1 e copia il risultato.