Compartir a través de


explícito (C++)

Constructores de C++ que hacen que un parámetro automáticamente realiza la conversión de tipos implícita.Por ejemplo, si se pasa int cuando el constructor cuenta con un parámetro de puntero de cadena, el compilador agregará código que debe tener para convertir int a un puntero de cadena.Sin embargo, puede que no desee siempre este comportamiento automático.

Puede agregar explicit a la declaración de constructor para evitar conversiones implícitas.Esto obliga al código para utilizar un parámetro de tipo correcto, o convierta el parámetro al tipo correcto.Es decir, si la conversión no se expresa visiblemente en código, se producirá un error.

La palabra clave de explicit sólo puede ser declaraciones aplicado al constructor de la en-clase explícitamente para construir un objeto.

Ejemplo

Compilar el programa siguiente generará errores.El código intenta realizar una conversión implícita, pero el uso de la palabra clavede explicitla evita.Para resolver el error, quite las palabras clave de explicit y ajuste el código en g.

// spec1_explicit.cpp
// compile with: /EHsc
#include <stdio.h>

class C 
{
public:
    int i;
    explicit C(const C&)   // an explicit copy constructor
    {
        printf_s("\nin the copy constructor");
    }
    explicit C(int i )   // an explicit constructor
    {
        printf_s("\nin the constructor");
    }

    C()
    {
        i = 0;
    }
};

class C2
{
public:
    int i;
    explicit C2(int i )   // an explicit constructor
    {
    } 
};

C f(C c)
{   // C2558
    c.i = 2;
    return c;   // first call to copy constructor
}

void f2(C2)
{
}

void g(int i)
{
    f2(i);   // C2558
    // try the following line instead
    // f2(C2(i));
}

int main()
{
    C c, d;
    d = f(c);   // c is copied
}

Declarar un constructor con varios argumentos a ser explicit no tiene ningún efecto, porque todos estos constructores no pueden participar en conversiones implícitas.Sin embargo, explicit tendrá un efecto si un constructor tiene varios argumentos y todos a menos que uno de los argumentos tiene un valor predeterminado.

Vea también

Referencia

Palabras clave de C++

Conversiones