Compartir a través de


Inicializar objetos asignados con new

Un campo initializer opcional se incluye en la gramática del operador new. Esto permite que los nuevos objetos se inicialicen con constructores definidos por el usuario. Para obtener más información sobre cómo se realiza la inicialización, vea Inicializadores. En el ejemplo siguiente se muestra la forma de utilizar una expresión de inicialización con el operador 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 );
    // ...
}

En este ejemplo, el objeto CheckingAcct se asigna utilizando el operador new, pero no se especifica ninguna inicialización predeterminada. Por lo tanto, se llama al constructor predeterminado para la clase, Acct(). El objeto SavingsAcct se asigna de la misma manera, salvo que se inicializa explícitamente en 34,98. Dado que 34,98 es de tipo double, se llama al constructor que toma un argumento de ese tipo para controlar la inicialización. Finalmente, el tipo HowMuch que no es de clase se inicializa en 43,0.

Si un objeto es de un tipo de clase y esa clase tiene constructores (como en el ejemplo anterior), el objeto se puede inicializar mediante el operador new solo si se cumple una de estas condiciones:

  • Los argumentos proporcionados en el inicializador concuerdan con los de un constructor.

  • La clase tiene un constructor predeterminado (un constructor al que se puede llamar sin argumentos).

El control de acceso y el control de ambigüedad se realizan en operator new y en los constructores de acuerdo con las reglas estipuladas en Ambigüedad y en Inicialización mediante el uso de funciones miembro especiales.

No puede realizarse ninguna inicialización explícita por elemento al asignar matrices mediante el operador new; solo se llama al constructor predeterminado, si existe. Vea Argumentos predeterminados para obtener más información.

Si se produce un error en la asignación de memoria (operator new devuelve un valor de 0), no se realiza ninguna inicialización. Esto protege contra intentos de inicializar datos que no existen.

Como sucede con las llamadas a funciones, no se define el orden en que se evalúan las expresiones inicializadas. Además, no debe dar por hecho que estas expresiones se hayan evaluado totalmente antes de que se realice la asignación de memoria. Si se produce un error en la asignación de memoria y el operador new devuelve cero, es posible que algunas expresiones del inicializador no se hayan evaluado totalmente.

Vea también

Referencia

new (Operador) (C++)