C++中的显式关键字意味着什么?
允许编译器进行一次隐式转换,以将参数解析为函数。这意味着编译器可以使用可通过单个参数调用的构造函数从一种类型转换为另一种类型,以获得参数的正确类型
下面是一个示例类,其构造函数可用于隐式转换:
类Foo
{
公众:
//单参数构造函数,可以用作隐式转换
Foo(int Foo):m_Foo(Foo)
{
}
int GetFoo(){return m_foo;}
私人:
林文福,;
};
下面是一个简单的函数,它接受一个Foo对象:
void-DoBar(Foo-Foo)
{
inti=foo.GetFoo();
}
这里调用了DoBar函数:
int main()
{
多巴(42);
}
参数不是Foo对象,而是int。但是,Foo存在一个构造函数,该构造函数接受int,因此可以使用该构造函数将参数转换为正确的类型
允许编译器对每个参数执行一次此操作
在构造函数前面加上explicit关键字可以防止编译器将该构造函数用于隐式转换。将其添加到上述类将在函数调用时产生编译器错误DoBar(42)。现在需要使用DoBar(Foo(42))
您这样做的原因可能是为了避免意外构造,从而隐藏bug。
人为的例子:
- 您有一个
MyString类,该类具有构造给定大小字符串的构造函数。您有一个函数print(const MyString)(以及一个重载print(char*string)),您可以调用print(3)(当您实际上打算调用print(";3";)时)。你希望它能打印出来;3",;,但它会打印一个长度为3的空字符串