Во время чтения книги Страуструпа "Язык программирования С++" я обратил внимание на ключевое слово explicit, которое периодически встречалось в примерах кода, представленных в книге. Это ключевое слово используется для запрещения создания конвертирующего конструктора. Поясню на примере:
class String {
public:
String (int n);//выделить n байт для создания объекта
String(const char *p); // инициализировать объект из C-строки
}
При этом если выполнить следующий код:
String s = 'x';
то 'x' преобразуется в int и будет вызван конструктор String(int). Это совсем не то поведение, которое можно было бы ожидать. Для избежания таких ситуаций и используется ключевое слово explicit:
class String {
public:
explicit String (int n);//выделить n байт для создания объекта
String(const char *p); // инициализировать объект из C-строки
}
Таким образом, объявление конструктора с одним аргументом (или с несколькими аргументами, где все, кроме первого имеют значения по умолчанию) explicit гарантирует неиспользование его в качестве оператора приведения типа.