码迷,mamicode.com
首页 > 其他好文 > 详细

(译)What does explicit keyword mean?

时间:2019-10-17 17:19:48      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:马虎   转换对象   显示   初始化   word   代码   默认   ble   bug   

原答案摘自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?

标签:马虎   转换对象   显示   初始化   word   代码   默认   ble   bug   

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11693064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!