В 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).