Compartilhar via


Explicit (C++)

Construtores de C++ que possuem apenas um parâmetro automaticamente executam conversão de tipo implícito.Por exemplo, se você passar um int quando o construtor espera um parâmetro de ponteiro da seqüência de caracteres, o compilador irá adicionar o código que ele deve ter para converter o int para um ponteiro de seqüência de caracteres.No entanto, você pode nem sempre é aconselhável esse comportamento automático.

Você pode adicionar explicit para a declaração do construtor para impedir que as conversões implícitas.Isso força o código para usar um parâmetro do tipo correto, ou converter o parâmetro para o tipo correto.Ou seja, se a projeção não é visivelmente expresso no código, ocorrerá um erro.

O explicit palavra-chave só pode ser aplicado a declarações de construtor explicitamente construir um objeto de classe.

Exemplo

Compilar o programa a seguir gerarão erros.O código tenta executar uma conversão implícita, mas cada um do explicitpalavra-chave impede que ela.Para resolver o erro, remova o explicit as palavras-chave e ajustar o código em 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
}

Declarando um construtor que possui vários argumentos para ser explicit não tem efeito, porque esses construtores não podem fazer parte de conversões implícitas.No entanto, explicit terá efeito se um construtor tem vários argumentos e todos, exceto um dos argumentos tem um valor padrão.

Consulte também

Referência

Palavras-chave C++

Conversões