Condividi tramite


Inizializzazione di oggetti allocati con new

Un campo initializer facoltativo è incluso nella grammatica dell'operatore new. In questo modo i nuovi oggetti possono essere inizializzati con i costruttori definiti dall'utente. Per ulteriori informazioni su come viene eseguita l'inizializzazione, vedere Inizializzatori. Nell'esempio seguente viene illustrato come utilizzare un'espressione di inizializzazione con l'operatore new:

// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
    // Define default constructor and a constructor that accepts
    //  an initial balance.
    Acct() { balance = 0.0; }
    Acct( double init_balance ) { balance = init_balance; }
private:
    double balance;
};

int main()
{
    Acct *CheckingAcct = new Acct;
    Acct *SavingsAcct = new Acct ( 34.98 );
    double *HowMuch = new double ( 43.0 );
    // ...
}

In questo esempio, l'oggetto CheckingAcct viene allocato utilizzando l'operatore new, ma non viene specificata alcuna inizializzazione predefinita. Viene pertanto chiamato il costruttore predefinito della classe Acct(). L'oggetto SavingsAcct viene quindi allocato nello stesso modo, con l'eccezione che viene inizializzato in modo esplicito su 34,98. Poiché 34,98 è di tipo double, viene chiamato il costruttore che accetta un argomento di tale tipo per gestire l'inizializzazione. Infine, il tipo nonclass HowMuch viene inizializzato su 43,0.

Se un oggetto è di un tipo di classe e tale classe dispone di costruttori (come nell'esempio precedente), l'oggetto può essere inizializzato dall'operatore new solo se si verifica una delle seguenti condizioni:

  • Gli argomenti forniti nell'inizializzatore concordano con quelli di un costruttore.

  • La classe dispone di un costruttore predefinito (un costruttore che può essere chiamato senza argomenti).

Il controllo di accesso e il controllo dell'ambiguità vengono eseguiti su operator new e sui costruttori in base alle regole definite in Ambiguità e Inizializzazione mediante le funzioni membro speciali.

Durante l'assegnazione alle matrici mediante l'operatore new non può essere eseguita alcuna inizializzazione per elemento esplicita; viene chiamato solo il costruttore predefinito, se presente. Per ulteriori informazioni, vedere Argomenti predefiniti.

Se l'allocazione di memoria ha esito negativo (operator new restituisce un valore 0), non viene eseguita alcuna inizializzazione. In questo modo viene garantita la protezione contro i tentativi di inizializzare dati inesistenti.

Come nel caso delle chiamate di funzione, l'ordine in cui le espressioni vengono valutate non è definito. Non bisogna inoltre fare affidamento sul fatto che queste espressioni vengano completamente valutate prima che venga eseguita l'allocazione della memoria. Se l'allocazione della memoria ha esito negativo e l'operatore new restituisce zero, alcune espressioni nell'inizializzatore non possono essere completamente valutate.

Vedere anche

Riferimenti

Operatore new (C++)