(译)What does explicit keyword mean?

Posted sanxiandoupi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(译)What does explicit keyword mean?相关的知识,希望对你有一定的参考价值。

原答案摘自Stack Overflow:What does the explicit keyword mean?

在把参数传递给函数时,如果变量类型不匹配的话,C++编译器会即尽可能的做一次隐式的类型转换来满足函数的参数要求。隐式的类型转换就会涉及到调用转换对象的单参数构造函数,下面是一个隐式转换的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
class 
{
public:

Foo (int foo) : m_foo (foo)
{
}

int GetFoo () { return m_foo; }

private:
int m_foo;
};

一个函数用了Foo对象作为参数:

1
2
3
4
大专栏  (译)What does explicit keyword mean?lass="line">void DoBar (Foo foo)
{
int i = foo.GetFoo ();
}

现在我们如下调用DoBar函数:

1
2
3
4
int main ()
{
DoBar (42);
}

很显然,实参类型不是Foo,而是int,但是在Foo对象里面有一个单参数的构造器接受了一个int类型来构造对象,因此编译器就会隐式的调用这个构造函数来把int转换成一个Foo

给这个构造器显示的指定为explicit就是告知编译器我们不想要这种隐式的类型转换,所以编译器就会禁止这种转换,如果我们再次使用DoBar(42)就会报错。

之所以提出这个关键字的原因是因为编译器的这种隐式转换可能会给我们的程序带来一些难以察觉的bug。比如:现在有个一类的构造函数:MyString(int size) 表示初始化这个字符长度为3。你调用了这个函数 print(const MyString&)希望打印出这个字符, 但是马虎的你把代码写成了 print(3) 。你希望的是打印出字符”3”,但是实际返回的是一个空的字符串并且长度为3。

编程建议:一般都要给单参数构造器(包括多参数构造器带有默认参数的)加上explicit

以上是关于(译)What does explicit keyword mean?的主要内容,如果未能解决你的问题,请参考以下文章

what does GIT PUSH do exactly?

What does jQuery.fn mean?

What does -1 mean in numpy reshape?

Lightroom’s Clarity Slider – What Does It Do?

What does it mean window.property in js?

What Your Computer Does While You Wait