C++ 只有explicit关键字,没有implicit关键字。编译器允许解析函数的参数时,对参数作隐式转换。也就是说,编译器能够使用带单个参数的构造函数,将函数参数转换为正确的类型。
带有单个形参的构造函数定义了一种由实参类型到类类型的隐式转换。
下面的类带有可用于隐式转换的构造函数:
DoBar的形参为Foo
对象,现在却传了一个int
给它,然而,Foo
类存在一个带有 int
类型的构造函数,所以编译器就用这个构造函数将参数隐式转换为 Foo
对象类型。
如果在构造函数前面加 explicit
关键字,就能阻止编译器使用这个构造函数做隐式转换,而是必须明确地写出:DoBar (Foo (42))
由于无意中的隐式转换会隐藏bug, 这就是构造函数前面加 explicit
的原因。
上面的例子,本意是要写成print("3"),但是不小心写成了 print(3), 编译器自行隐式使用构造函数 MyString(3), 将临时对象传递给print,输出“xxx”,但是如果在构造函数 MyString(int size) 前加“explicit", 写成print(3) 编译时就会报错,显式写成 print(Mystring(3))就不会。
再如:
由于same_isbn 函数要求传入 Sales_item 对象的参数,现在传入的是string,于是编译器自动使用带string参数的构造函数隐式转换,生成一个Sales_item临时对象,传给same_isbn函数。代码虽然能执行,但也可能是用户写错了。
一个使用了explicit关键字的类:
閱讀更多 晨夕Sama 的文章