explicit
关键字在C ++中是什么意思?
允许编译器进行一次隐式转换,以将参数解析为函数。这意味着编译器可以使用可通过单个参数调用的构造函数从一种类型转换为另一种类型,以便获得参数的正确类型。
这是带有可用于隐式转换的构造函数的示例类:
class Foo
{
public:
// single parameter constructor, can be used as an implicit conversion
Foo (int foo) : m_foo (foo)
{
}
int GetFoo () { return m_foo; }
private:
int m_foo;
};
这是一个带Foo
对象的简单函数:
void DoBar (Foo foo)
{
int i = foo.GetFoo ();
}
这是该DoBar
函数的调用位置:
int main ()
{
DoBar (42);
}
参数不是Foo
对象,而是int
。但是,存在一个Foo
需要一个的构造函数,int
因此可以使用该构造函数将参数转换为正确的类型。
允许编译器对每个参数执行一次此操作。
explicit
给构造函数加上关键字前缀可以防止编译器使用该构造函数进行隐式转换。将其添加到上述类中会在函数调用时产生编译器错误DoBar (42)
。现在有必要使用DoBar (Foo (42))
您可能要执行此操作的原因是为了避免可能隐藏错误的意外构造。
人为的例子:
MyString(int size)
带有构造函数的类,该构造函数构造给定大小的字符串。您有一个函数print(const MyString&)
,并且您可以进行调用print(3)
(实际打算调用时print("3")
)。您希望它打印“ 3”,但是它将打印一个长度为3的空字符串。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句