Поделиться через


explicit (C++)

Конструкторы C++, которые имеют только один параметр автоматически выполнять неявное преобразование типа.Например, если передается int если конструктор ожидает параметр указателя строки, компилятор добавляет код он должен преобразовать int на указатель строки.Однако не всегда потребоваться эту автоматического расширения функциональности.

Можно добавить explicit к объявлению конструктора, чтобы избежать неявного преобразования.Это заставляет код или использовании параметра неправильный тип или параметр приведет к нужному типу.То есть, если приведение заметно не выражается в коде, возникнет ошибка.

explicit ключевое слово может быть только конструктора в-класса примененные объявлениями явным образом для создания объекта.

Пример

Компилировать следующая программа создаст ошибки.Код пытается выполнить неявное преобразование, но использование explicitключевое слово предотвращает его.Чтобы разрешить данную ошибку, удалите explicit ключевые слова и обрабатывают код внутри 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
}

Объявление конструктор, который имеет несколько аргументов были explicit не влияет, поскольку эти конструкторы не могут принимать участие в неявных преобразованиях.Однако explicit имеет эффекта, если конструктор имеет несколько аргументов и все, за исключением того, что один из аргументов имеет значения по умолчанию.

См. также

Ссылки

Ключевые слова C++

Преобразования