我理解'明确'与C ++中的构造函数相关的概念,它将单个参数作为输入。但我在一些网站上读到,我们需要将构造函数更改为显式,而不管构造函数将作为输入的参数数量。
任何人都可以帮助我理解下面的问题。
答案 0 :(得分:2)
为什么我们需要在不接受任何输入的情况下将构造函数设为显式?
这对我来说似乎不对。如果您不希望自动调用构造函数,则构造函数需要是显式的。
说你有:
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
。 IMO,这个实用性较低。无意中滥用构造函数与一个参数的可能性是真实的。无意中滥用具有多个参数的构造函数的可能性非常小。
答案 1 :(得分:2)
从不同的角度来补充@R Sahu的回答:
对于每个构造函数使用explicit
的建议,无论它采用了多少参数,都可以说明这样一个事实,即严格来说每个C ++构造函数默认都应该explicit
,而我们会使用{{1关键字:why constructors aren't explicit by default?
我多次看到这个问题:最初一个类有一个默认的构造函数。然后一段时间后它被修改并添加一个参数。在这种情况下,很容易忘记添加implicit
。
从双参数构造函数中删除参数时,忘记添加explicit
会更容易。通常,您的初始explicit
单参数构造函数会获得其他参数或丢失其参数,但错误地遗留了explicit
,编译器也不会抱怨这一点。
一段时间后,您的代码开始看起来像一棵圣诞树,其中有许多构造函数应该是explicit
但不是,而其他构造函数应该是但不应该。
我假设这就是您提到的网站建议始终使用explicit
的原因。