Конструктор или пользовательский оператор преобразования пропускают explicit
спецификатор
Этот дефект возникает, когда объявление или определение в классе конструктора или пользовательского оператора преобразования не использует explicit
спецификатор. The 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 |
Влияние: Низкое |