Указание метода / конструктора явное означает, что его нельзя назвать неявно?

StackOverflow https://stackoverflow.com/questions/4427144

Вопрос

Указание метода / конструктора явное означает, что его нельзя назвать неявно? Я имею в виду, если конструктор указан в виде явного, не может ли он быть неявно вызванным неявным оператором, как = или другие методы, такие как конвертерный конструктор?

В этом случае определяет метод / конструктор, чтобы быть явным иметь какое-либо важное значение? Каковы преимущества указания метода / конструктора, чтобы быть явным?

Это было полезно?

Решение

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

Благодаря той линии, как это выше, очень часто случается, что программист имел что-то другое в виду, и это преобразование совершенно непреднамеренное.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top