Initialisation des objets alloués avec new
Un champ initializer facultatif est inclus dans la grammaire pour l'opérateur new. Cela permet aux nouveaux objets d'être initialisés avec les constructeurs définis par l'utilisateur. Pour plus d'informations sur la façon dont l'initialisation est faite, consultez Initialiseurs. L'exemple suivant montre comment utiliser une expression d'initialisation avec l'opérateur 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 );
// ...
}
Dans cet exemple, l'objet CheckingAcct est alloué à l'aide de l'opérateur new, mais aucune initialisation par défaut n'est spécifiée. Par conséquent, le constructeur par défaut pour la classe, Acct(), est appelé. Puis l'objet SavingsAcct est alloué de la même façon, mais il est initialisé explicitement à 34,98. Comme 34,98 est du type double, le constructeur qui prend un argument de ce type est appelé pour traiter l'initialisation. Enfin, le type sans classe HowMuch est initialisé à 43,0.
Si un objet est d'un type classe et que cette classe a des constructeurs (comme dans l'exemple précédent), l'objet peut être initialisé par l'opérateur new uniquement si une des conditions suivantes est remplie :
Les arguments fournis dans l'initialiseur sont conformes à ceux d'un constructeur.
La classe possède un constructeur par défaut (un constructeur pouvant être appelé sans argument).
Le contrôle d'accès et le contrôle d'ambiguïté sont exécutés sur operator new et sur les constructeurs selon les règles définies dans Ambiguïté et Initialisation à l'aide de fonctions membres spéciales.
Aucune initialisation explicite par élément ne peut être effectuée en allouant des tableaux à l'aide de l'opérateur new ; seul le constructeur par défaut, le cas échéant, est appelé. Pour plus d'informations, consultez Arguments par défaut.
Si l'allocation de mémoire échoue (operator new retourne la valeur 0), aucune initialisation n'est effectuée. Cela empêche les tentatives d'initialisation de données qui n'existent pas.
Comme avec les appels de fonction, l'ordre dans lequel les expressions initialisées sont évaluées n'est pas défini. En outre, vous ne devez pas vous attendre à ce que ces expressions soient complètement évaluées avant que l'allocation de mémoire soit exécutée. Si l'allocation de mémoire échoue et que l'opérateur new retourne zéro, certaines expressions dans l'initialiseur ne peuvent être entièrement évaluées.