Явный конструктор (explicit)
В C++ конструкторы можно объявлять с ключевым словом explicit:
class Foo {
public:
Foo();
explicit Foo(int);
};
В стандарте за использование слова explicit в конструкторе отвечает раздел 12.3.1 Conversion by constructor [class.conv.ctor].
Слово explicit с английского переводится как “явный”, при использовании конструктора c ним нельзя будет неявно(implicit) преобразовать объекты(преобразование идет путем вызова конструктора) :
int main () {
Foo a2(3); // ok
Foo a2 = 3; // error,
Foo a3 = Foo(3); // ok, copy or move constructor used which are created automatically
Foo a4 = (Foo)3; //ok, explicit cast used
}
По умолчанию, если не указано слово explicit, конструктору разрешено делать неявные преобразования.
Пусть у нас есть класс Rational(этот пример взят из книги Скотта Мейерса, из 50 советов, совет 19) :
class Rational {
public :
Rational (int num = 0, int den = 1);
const Rational operator * (const Rational& rhs) const;
};
Тогда для данного класса допустимо использование :
Rational r1(5, 6);
Rational r2 = temp * 2;
Потому что последняя строчка вызовет operator* и неявно сконвертирует 2 к типу Rational используя конструктор :
Rational r2 = temp.operator*(2); // неявное преобразование 2 к Rational(2)
И если в данном примере объявить Rational конструктор как explicit, то компилятор выдаст ошибку о том, что явный конструктор использовуется неявно(implicitly).