Compartir a través de


Inicialización explícita

C++ admite dos formas de inicialización explícita.

  • Proporcionar una lista de inicializadores entre paréntesis:

    String sFileName( "FILE.DAT" );
    

    Los elementos de la lista entre paréntesis se consideran argumentos del constructor de clase. Esta forma de inicialización permite la inicialización de un objeto con más de un valor y también se puede usar junto con el operador new. Por ejemplo:

    Rect *pRect = new Rect( 10, 15, 24, 97 );
    
  • Proporcionar un único inicializador mediante la sintaxis de inicialización del signo igual. Por ejemplo:

    String sFileName = "FILE.DAT";
    

    Aunque el ejemplo anterior funciona de la misma manera que el ejemplo mostrado para String en el primer elemento de lista, la sintaxis no puede adaptarse para usarla con objetos asignados en el almacén libre.

    La expresión única de la derecha del signo igual se toma como argumento del constructor de copias de clase; por consiguiente, debe ser un tipo que pueda convertirse al tipo de clase.

    Tenga en cuenta que, dado que el signo igual (=) en el contexto de inicialización es diferente de un operador de asignación, la sobrecarga de operator= no tiene ningún efecto en la inicialización.

La sintaxis de inicialización del signo igual es diferente de la sintaxis de estilo de función, aunque el código generado es idéntico en la mayoría de los casos. La diferencia es que cuando se usa la sintaxis de signo igual, el compilador tiene que comportarse como si se produjera la siguiente secuencia de eventos:

  • Crear un objeto temporal del mismo tipo que el objeto que se está inicializando.

  • Copiar el objeto temporal en el objeto.

El constructor debe ser accesible antes de que el compilador pueda realizar estos pasos. Aunque el compilador puede eliminar los pasos temporales de creación y copia en la mayoría de los casos, un constructor de copias inaccesible provoca que la inicialización de signo igual produzca un error (en /Za, /Ze (Deshabilitar extensiones de lenguaje)). Considere el ejemplo siguiente:

// spec1_explicit_initialization.cpp
// compile with: /Za
class anInt {
   anInt( const anInt &copy ) {}   // private copy constructor

public:
   anInt( int ) {}   // public constructor
};

int main() {
   // Access-control violation. 
   // Attempt to reference private copy constructor.
   anInt myInt = 7;   // C2248

   anInt myInt2(7);   // Correct; no copy constructor called.
}

Cuando se llama a una función, los argumentos de tipo de clase pasados por valor y los objetos devueltos por valor se inicializan conceptualmente de la forma siguiente:

type-name name = value

Por ejemplo:

String s = "C++";

Por consiguiente, el tipo del argumento debe ser un tipo que pueda convertirse al tipo de clase que se pasa como argumento. El constructor de copias de la clase, así como los operadores de conversión definidos por el usuario o los constructores que acepten el tipo de argumento real, deben ser públicos.

En las expresiones que usan el operador new, los objetos asignados en el almacén libre se inicializan conceptualmente de la forma siguiente:

type-name name**(** initializer1, initializer2, ... initializer)

Por ejemplo:

String *ps = new String( "C++" );

Los inicializadores para los componentes de la clase base y los objetos miembro de una clase también se inicializan conceptualmente de esta manera. (Para obtener más información, vez Inicialización de bases y miembros.)

Vea también

Referencia

Inicializar utilizando Funciones miembro especiales