Указание метода / конструктора явное означает, что его нельзя назвать неявно?
-
09-10-2019 - |
Вопрос
Указание метода / конструктора явное означает, что его нельзя назвать неявно? Я имею в виду, если конструктор указан в виде явного, не может ли он быть неявно вызванным неявным оператором, как = или другие методы, такие как конвертерный конструктор?
В этом случае определяет метод / конструктор, чтобы быть явным иметь какое-либо важное значение? Каковы преимущества указания метода / конструктора, чтобы быть явным?
Решение
class MyClass
{
int i;
MyClass(YourClass &);
};
class YourClass
{
int y;
};
void doSomething(MyClass ref)
{
//Do something interesting over here
}
int main()
{
MyClass obj;
YourClass obj2;
doSomething(obj2);
}
В примере, так как конструктор MyClass
не указан как явный, он используется для неявного преобразования при вызове функции doSomething()
. Отказ Если конструктор MyClass
помечается как явное, то компилятор даст ошибку вместо неявной конверсии при вызове doSomething()
функция. Так что если вы хотите избежать таких неявных преобразований, то вы должны использовать explicit
ключевое слово.
Чтобы добавить в вышеизложенное: ключевое слово explicit
Может использоваться только для конструкторов и не функций. Хотя его можно использовать для конструкторов более чем более чем более чем параметрами, нет практического использования ключевого слова для конструкторов с более чем одним параметром, поскольку компилятор может использовать только конструктор с одним параметром для неявных преобразований.
Другие советы
Функция не может иметь спецификатор явного. Это не имеет смысла для FNC иметь явный спецификатор. И как для CTOR - ответ на ваш Q - да. С заявлением, что CTOR явный это означает, что нелегально назвать это неявно.
Когда это полезно? В ситуации, когда, например, ваш класс:
class X
{
X(char){/*something really cool*/}
};
А позже в коде вы бы написали:
X _1 = 'a';//this line will call conv ctor
Благодаря той линии, как это выше, очень часто случается, что программист имел что-то другое в виду, и это преобразование совершенно непреднамеренное.