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

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

Может ли кто-нибудь помочь мне разобраться в следующих вопросах.

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

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

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

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

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

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

0 голосов
/ 30 апреля 2018

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

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

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

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. ИМО, в этом меньше полезности. Возможность непреднамеренного неправильного использования конструктора с одним аргументом реальна. Возможность непреднамеренного неправильного использования конструктора с более чем одним аргументом очень мала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...