explicit
关键字在C++中是什么意思?
最佳答案
允许编译器进行一次隐式转换以将参数解析为函数。这意味着编译器可以使用可通过单个参数调用的构造函数从一种类型转换为另一种类型,以便为参数获取正确的类型。
这是一个带有构造函数的示例类,可用于隐式转换:
class Foo
{
private:
int m_foo;
public:
// single parameter constructor, can be used as an implicit conversion
Foo (int foo) : m_foo (foo) {}
int GetFoo () { return 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
类,它有一个构造函数,可以构造一个给定大小的字符串。你有一个函数print(const MyString&)
(以及一个重载print (char *string)
),你调用print(3)
(当您实际上打算调用print("3")
时)。您希望它打印“3”,但它会打印一个长度为 3 的空字符串。
关于c++ - 显式关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121162/