Udostępnij za pośrednictwem


jawne (C++)

Konstruktory C++, które mają tylko jeden parametr automatycznie wykonywać niejawna konwersja typu.Na przykład, jeśli przekażemy int podczas konstruktora oczekuje, że parametr wskaźnika ciąg, kompilator doda kod musi mieć do konwersji int do wskaźnika ciąg.Jednakże nie zawsze warto to automatyczne zachowanie.

Można dodać explicit do deklaracji konstruktora, aby zapobiec konwersje niejawne.Zmusza to kod, należy użyć parametru poprawnego typu lub oddanych parametru do poprawnego typu.Oznacza to, że jeżeli Obsada nie jest widoczny wyrażone w kodzie, spowoduje zgłoszenie błędu.

explicit Słowa kluczowego mogą być stosowane tylko do konstruktora deklaracji do konstruowania jawnie obiektu w klasie.

Przykład

Kompilowanie następujący program powoduje wygenerowanie błędy.Kod próbuje wykonać niejawna konwersja, ale wykorzystanie explicituniemożliwia słowa kluczowego.Aby rozwiązać problem, należy usunąć explicit słowa kluczowe i dopasować kod w 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
}

Deklarowanie konstruktora, który ma wiele argumentów za explicit nie ma wpływu, ponieważ takie konstruktory nie może brać udział w konwersje niejawne.Jednakże explicit będzie miał wpływ, jeśli Konstruktor ma wiele argumentów i wszystkie z wyjątkiem jednego z argumentów ma wartość domyślną.

Zobacz też

Informacje

Słów kluczowych języka C++

Konwersje