Шаг 38.
Библиотека STL.
Ключевое слово explicit

    На этом шаге мы рассмотрим особенности использования ключевого слова 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 создается с неявным преобразованием.

    На следующем шаге мы рассмотрим новые операторы преобразования типа.




Предыдущий шаг Содержание Следующий шаг