Ключевое слово explicit
Ключевое слово explicit указывается перед конструктором
или оператором преобразования и запрещает компилятору
выполнять неявные преобразования типов с использованием
этого конструктора или оператора. Без explicit
конструктор с одним параметром может вызываться автоматически
для приведения типа, что порой приводит к неожиданному
поведению программы. Ключевое слово explicit не
принимает параметров и применяется только к конструкторам
и операторам преобразования.
Синтаксис
explicit ClassName(parameters);
explicit operator TypeName() const;
Пример
Рассмотрим класс Number с конструктором, принимающим
одно целое число. Без explicit компилятор позволяет
неявно преобразовывать число 42 в объект класса:
#include <iostream>
using namespace std;
class Number
{
public:
int value;
Number(int v)
{
value = v;
}
};
void print(Number n)
{
cout << n.value << endl;
}
int main()
{
print(42);
return 0;
}
Результат выполнения кода:
42
Пример
Теперь добавим explicit к конструктору. Неявное
преобразование станет невозможным, и вызов print(42)
приведёт к ошибке компиляции. Придётся явно создавать объект:
#include <iostream>
using namespace std;
class Number
{
public:
int value;
explicit Number(int v)
{
value = v;
}
};
void print(Number n)
{
cout << n.value << endl;
}
int main()
{
print(Number(42));
return 0;
}
Результат выполнения кода:
42
Пример
Ключевое слово explicit можно применять и к
операторам преобразования. Рассмотрим класс Flag,
который хранит логическое значение и преобразуется в bool
только явно:
#include <iostream>
using namespace std;
class Flag
{
private:
bool state;
public:
Flag(bool s)
{
state = s;
}
explicit operator bool() const
{
return state;
}
};
int main()
{
Flag f(true);
if (static_cast<bool>(f))
{
cout << "true" << endl;
}
return 0;
}
Результат выполнения кода:
true
Смотрите также
-
ключевое слово
constructor,
который создаёт объект класса -
ключевое слово
copy-ctor,
который создаёт копию объекта -
ключевое слово
operator,
который перегружает операторы класса -
ключевое слово
deleted,
который запрещает использование метода