Означает ли указание метода / конструктора явным образом, что он не может быть вызван неявно? - PullRequest
1 голос
/ 13 декабря 2010

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

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

Ответы [ 2 ]

1 голос
/ 13 декабря 2010
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 можно использовать только для конструкторов, а не для функций.Хотя его можно использовать для конструкторов с более чем несколькими параметрами, практического использования ключевого слова для конструкторов с более чем одним параметром нет, поскольку компилятор может использовать конструктор только с одним параметром для неявных преобразований.

0 голосов
/ 13 декабря 2010

Функция не может иметь явный спецификатор.Для fnc не имеет смысла иметь явный спецификатор.А что касается ctor - ответ на ваш вопрос - Да.Заявление о том, что ctor является явным, означает, что незаконно вызывать его неявно.
Когда это полезно?В ситуации, когда, например, ваш класс:

class X
{
X(char){/*something really cool*/}
};

и позже в коде вы должны написать:

X _1 = 'a';//this line will call conv ctor

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

...