内容来自 DOC https://q.houxu6.top/?s=显式关键字是什么意思?
在C++中,explicit
关键字是什么意思?
编译器被允许进行一次隐式转换以解析参数为函数。这意味着编译器可以使用带有单个参数的构造函数将类型转换为另一个类型,以获得正确的参数类型。
以下是具有可用于隐式转换的构造函数的示例类:
class Foo
{
private:
int m_foo;
public:
// 单参数构造函数,可用于隐式转换
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
。但是,存在一个接受int
的Foo
构造函数,因此该构造函数可用于将参数转换为正确的类型。
编译器只允许对每个参数执行一次此操作。
在构造函数前加上explicit
关键字会阻止编译器使用该构造函数进行隐式转换。在上面的类中添加它会导致在函数调用DoBar (42)
时出现编译器错误。现在必须显式地使用转换DoBar (Foo (42))
来调用它。
您可能需要这样做的原因是为了避免意外构建而隐藏的错误。
牵强的例子:
- 您有一个带有给定大小的字符串构造函数的
MyString
类,以及一个print(const MyString&)
(以及重载的print (char *string)
)函数,并且您调用了print(3)
(当您实际上打算调用print("3")
时)。您期望它会打印"3",但它打印了一个长度为3的空字符串。