MyTetra Share
Делитесь знаниями!
C++: Ключевое слово explicit. Явные конструкторы
Время создания: 02.07.2015 12:37
Текстовые метки: C++, explicit, явный конструктор
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/143582986251vp6w4p0i/text.html на raw.github.com

Кратко: ключевое слово explicit, примененное перед конструктором, делает так, что такой конструктор не может использоваться для неявных преобразованией типов. Подробности далее.




Ключевое слово explicit


Ключевое слово explicit используется для создания явных конструкторов. Другое название - «неконвертирующиеся конструкторы» (nonconverting constructors).

Рассмотрим следующий класс:


class MyClass {

int i;

public:

MyClass(int j)

{i = j;}

// ...

};



Объекты этого класса могут быть объявлены двумя способами:



MyClass ob1(1);

MyClass ob2 = 10;


В данном случае инструкция:


MyClass ob2 = 10;


автоматически конвертируется в следующую форму:


MyClass ob2(10);


Однако, если объявить конструктор MyClass с ключевым словом explicit, то это автоматическое конвертирование не будет выполняться. Ниже объявление класса MyClass показано с использовани­ем ключевого слова explicit при объявлении конструктора:


class MyClass {

int i;

public:

explicit MyClass(int j)

{i = j;}

// ...

};


Теперь допустимыми являются только конструкции следующего вида:


MyClass ob (110);


Вот и все объяснение. Но есть и нюансы (подводные камни) о которых необходимо помнить. Вот выдержка из Википедии:



Операторы явного преобразования


Стандарт C++ предлагает ключевое слово explicit как модификатор конструкторов с одним параметром, чтобы такие конструкторы не функционировали как конструкторы неявного преобразования. Однако это никак не влияет на действительные операторы преобразования. Например, класс умного указателя может содержать operator bool() для имитации обычного указателя. Такой оператор можно вызвать, например, так: if(smart_ptr_variable) (ветка выполняется, если указатель ненулевой). Проблемой является то, что такой оператор не защищает от других непредвиденных преобразований. Поскольку в C++ тип bool объявлен как арифметический, возможно неявное преобразование в любой целочисленный тип или даже в тип числа с плавающей точкой, что в свою очередь может привести к непредвиденным математическим операциям.

В C++11 ключевое слово explicit применимо и к операторам преобразования. По аналогии с конструкторами, оно защищает от непредвиденных неявных преобразований. Однако ситуации, когда язык по контексту ожидает булевый тип (например, в условных выражениях, циклах и операндах логических операторов), считаются явными преобразованиями и оператор явного преобразования в bool вызывается непосредственно.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования