Espacios de nombres
Variantes
Acciones

Constructor de conversión

De cppreference.com
< cpp‎ | language
 
 
 
 

A un constructor que no se declara con el especificador explicit y que puede llamarse con un solo parámetro (hasta C++11) se le llama un constructor de conversión.

A diferencia de los constructores explícitos, que solamente se consideran durante la inicialización directa (que incluye conversiones explícitas tal como static_cast), los constructores de conversión también se consideran durante la inicialización de copia, como parte de la secuencia de conversión definida por el usuario.

Se dice que un constructor de conversión especifica una conversión implícita a partir de los tipos de sus argumentos (si es que los hay) al tipo de su clase. Observa que una función de conversión definida por el usuario no explícita también especifica una conversión implícita.

Los constructores de copia implícitamente declarados y definidos por el usuario, así como los constructores de movimiento son constructores de conversión.

[editar] Ejemplo

struct A
{
    A() { }         // constructor de conversión (desde C++11)  
    A(int) { }      // constructor de conversión
    A(int, int) { } // constructor de conversión (desde C++11)
};
 
struct B
{
    explicit B() { }
    explicit B(int) { }
    explicit B(int, int) { }
};
 
int main()
{
    A a1 = 1;      // de acuerdo: inicialización de copia selecciona a A::A(int)
    A a2(2);       // de acuerdo: inicialización directa selecciona a A::A(int)
    A a3{4, 5};    // de acuerdo: inicialización directa de lista selecciona a 
                   //             _A(int, int)
    A a4 = {4, 5}; // de acuerdo: inicialización de copia de lista selecciona a 
                   //             A::A(int, int)
    A a5 = (A)1;   // de acuerdo: conversión explícita realiza static_cast, 
                   //             inicialización directa
 
//  B b1 = 1;      // ERROR: inicialización de copia no considera a B::B(int)
    B b2(2);       // de acuerdo: inicialización directa selecciona a B::B(int)
    B b3{4, 5};    // de acuerdo: inicialización directa de lista selecciona a 
                   //             B::B(int, int)
//  B b4 = {4, 5}; // ERROR: inicialización de copia de lista seleccionó un constructor
                   //        explícito B::B(int, int)
    B b5 = (B)1;   // de acuerdo: conversión explícita realiza static_cast, inicialización
                   //             directa
    B b6;          // de acuerdo, inicialización por defecto
    B b7{};        // de acuerdo, inicialización directa de lista
//  B b8 = {};     // ERROR: inicialización de copia de lista seleccionó un constructor 
                   //        explícito B::B()
}


[editar] Véase también