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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий