Использование явного конструктора, если конструктор не принимает никаких входных параметров?

Я понял «явную» концепцию, связанную с конструкторами в C ++, которые будут принимать один параметр в качестве входных данных. Но я читал на некоторых сайтах, что нам нужно изменить конструктор на явный, независимо от количества параметров, которые конструктор примет в качестве входных данных.

Может ли кто-нибудь, пожалуйста, помогите мне понять ниже вопросы

  1. Почему нам нужно сделать конструктор явным, если он не требует ввода?
  2. Какая польза от создания конструктора как явного, если он принимает более одного параметра и все параметры не являются значениями по умолчанию?

0

Решение

Почему нам нужно сделать конструктор явным, если он не требует ввода?

Это кажется мне неправильным. Конструктор должен быть явным, если вы не хотите, чтобы конструктор вызывался автоматически.

Скажем, у вас есть:

struct Foo
{
Foo() {}
Foo(int) {}
};

void bar(Foo)
{
}

Затем,

bar(1);

буду работать. Это переводится как:

bar(Foo(1));

Если есть конструктор по умолчанию, то есть тот, который не принимает аргументов, преобразовывать нечего. Вы не можете использовать:

bar();

и надеюсь перевести это как:

bar(Foo{});

Какая польза от создания конструктора как явного, если он принимает более одного параметра и все параметры не являются значениями по умолчанию?

У этого есть некоторая законность.

Если у тебя есть:

struct Foo
{
Foo() {}
Foo(int, int) {}
};

void bar(Foo)
{
}

Вы не можете использовать

bar(10, 20);

или же

bar((10, 20));

и надеюсь перевести это как:

bar(Foo(10, 20));

Тем не менее, вы можете использовать:

bar({10, 20});

и это будет переведено как:

bar(Foo{10, 20});

Если вы хотите предотвратить использование этого синтаксиса, bar({10, 20})Вы можете сделать конструктор explicit, ИМО, в этом меньше полезности. Возможность непреднамеренного неправильного использования конструктора с одним аргументом реальна. Возможность непреднамеренного неправильного использования конструктора с более чем одним аргументом очень мала.

2

Другие решения

Просто чтобы дополнить ответ @R Sahu с другой точки зрения:

Рекомендация использовать explicit для каждого конструктора, независимо от того, сколько аргументов он принимает, может исходить из того, что строго говоря, каждый конструктор C ++ должен быть explicit по умолчанию и вместо этого мы будем использовать implicit ключевое слово: почему конструкторы не являются явными по умолчанию?

Я видел эту проблему очень много раз: изначально класс имеет конструктор по умолчанию. Затем через некоторое время он изменяется и добавляется параметр. Очень легко забыть добавить explicit в этом случае.

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

Через некоторое время ваш код начинает выглядеть как рождественская елка со многими конструкторами, которые должны быть explicit но нет и другие, которые есть, но не должны.

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

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector