На этом шаге мы рассмотрим особенности использования ключевого слова explicit.
Ключевое слово explicit запрещает автоматическое преобразование типа для конструктора с одним аргументом. Типичный пример ситуации, в которой это необходимо, - класс коллекции (например, стек), конструктору которого при вызове передается начальный размер коллекции:
class Stack { explicit Stack(int size): // Создание стека с заданным . . . . // исходным размером };
В данном случае ключевое слово explicit играет очень важную роль. Без explicit этот конструктор автоматически определял бы преобразование типа из int в Stack. В этом случае объектам типа Stack можно было бы присваивать тип int:
Stack s; s = 40: // Команда создает новый стек на 40 элементов // и присваивает его s.
В результате автоматического преобразования типа число 40 преобразуется в стек из 40 элементов, а результат присваивается s. Вряд ли это именно то, что предполагалось. Но если объявить конструктор int с ключевым словом explicit, попытка присваивания вызовет ошибку на стадии компиляции.
Учтите, что слово explicit также исключает инициализацию с автоматическим преобразованием типа при присваивании:
Stack S1(40): // OK Stack S2 = 40; // ОШИБКА
Дело в том, что между следующими двумя парами строк существует тонкое различие:
X х; Y у(х); // Явное преобразование X х; Y у = х; // Неявное преобразование
В первом фрагменте новый объект типа Y создается явным преобразованием от типа X, тогда как во втором фрагменте новый объект типа Y создается с неявным преобразованием.
На следующем шаге мы рассмотрим новые операторы преобразования типа.