Используется для украшения конструкторов; оформленный таким образом конструктор не может использоваться компилятором для неявных преобразований.
C ++ допускает до одного пользовательского преобразования, где «пользовательский» означает «посредством конструктора класса», например, в:
class circle {
circle( const int r ) ;
}
circle c = 3 ; // implicit conversion using ctor
компилятор вызовет здесь окружность ctor, constructinmg circle c
со значением 3 для r
.
явный
используется, когда вы этого не хотите. Добавление явного значения означает, что вам придется явно построить:
class circle {
explicit circle( const int r ) ;
}
// circle c = 3 ; implicit conversion not available now
circle c(3); // explicit and allowed
Ключевое слово явное
предотвращает неявные преобразования.
// Does not compile - an implicit conversion from const char* to CImg
CImg image = "C:/file.jpg"; // (1)
// Does compile
CImg image("C:/file.jpg"); // (2)
void PrintImage(const CImg& img) { };
PrintImage("C:/file.jpg"); // Does not compile (3)
PrintImage(CImg("C:/file.jpg")); // Does compile (4)
Без ключевого слова явным
операторы (1) и (3) будут компилироваться, потому что компилятор видит, что const char *
может быть неявно преобразовано в CImg
(через конструктор, принимающий const char *
). Иногда такое неявное преобразование нежелательно, потому что оно не всегда имеет смысл.