如果构造函数不接受任何输入参数,则使用显式构造函数?

时间:2018-04-30 20:10:54

标签: c++ constructor

我理解'明确'与C ++中的构造函数相关的概念,它将单个参数作为输入。但我在一些网站上读到,我们需要将构造函数更改为显式,而不管构造函数将作为输入的参数数量。

任何人都可以帮助我理解下面的问题。

  1. 为什么我们需要将构造函数设为显式,如果它没有输入任何内容?
  2. 如果构造函数需要多个参数并且所有参数都不是默认值,那么将构造函数设置为显式是什么用途?

2 个答案:

答案 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的原因。