В конструкторе или определяемом пользователем операторе преобразования отсутствует 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++ |
| По умолчанию: Откл. |
Синтаксис командной строки: MISSING_EXPLICIT_KEYWORD |
| Воздействие: Низкий |