Конструктор или пользовательский оператор преобразования, пропускающий 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 |
| Удар: низко |