Конструктор или пользовательский оператор преобразования, пропускающий explicit
спецификатор
Этот дефект происходит, когда объявление или в определении класса конструктора или пользовательского оператора преобразования не использует explicit
спецификатор. explicit
спецификатор предотвращает неявное преобразование из переменной другого типа к текущему типу класса.
Дефект применяется:
Конструкторы с одним параметром.
Конструкторы, где у всех кроме параметров есть значения по умолчанию.
Например, MyClass::MyClass(float f, bool b=true){}
.
Пользовательские операторы разговора.
Например, operator int() {}
преобразует переменную текущего типа класса к int
переменная.
Если вы не объявляете конструктора или оператор преобразования explicit
, компиляторы могут выполнить неявные и часто непреднамеренные преобразования типов к или от типа класса возможно неожиданными результатами.
Неявное преобразование с помощью конструктора может произойти, например, когда функция принимает параметр типа класса, но вы вызываете функцию с аргументом другого типа. Вызов func
здесь вызывает неявное преобразование из типа int
к myClass
:
class myClass {}{ ... myClass(int) {...} }; void func(myClass); func(0);
Противоположное неявное преобразование может произойти при использовании пользовательского оператора преобразования. Например, вы передаете тип класса в качестве аргумента, но функция имеет параметр другого типа. Вызов func
здесь вызывает неявное преобразование из типа myClass
к int
:
class myClass {} { ... operator int() {...} }; myClass myClassObject; void func(int) {...} func(myClassObject);
Для лучшей удобочитаемости вашего кода и предотвратить неявные преобразования, в объявлении или в определении класса конструктора или оператора преобразования, помещают explicit
ключевое слово перед конструктором или именем оператора. Можно затем обнаружить все неявные преобразования как ошибки компиляции и преобразовать их в явные преобразования.
Группа: Объектно-ориентированный |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки: MISSING_EXPLICIT_KEYWORD |
Удар: низко |