C++ explicit 是干什么的
explicit 的作用
explicit
是一个关键字,用于声明一个单参数构造函数或转换函数(转换构造函数)时,指示该构造函数或转换函数是显式的,禁止隐式类型转换。这意味着只有在明确要求的情况下才会调用该构造函数或转换函数,而不会进行隐式类型转换。
通常,当类定义了一个参数的构造函数时,该构造函数可以被隐式地用于类型转换,例如将一个参数类型转换为该类的类型。而使用 explicit
关键字可以禁止这种隐式类型转换,强制要求在转换时使用显式的类型转换操作符(例如 static_cast
、dynamic_cast
等)。
示例
以下是一个简单的示例说明 explicit
的作用:
#include <iostream>
class MyInt
{
public:
explicit MyInt(int val) : value(val) {}
int getValue() const
{
return value;
}
private:
int value;
};
void printInt(const MyInt& myInt)
{
std::cout << myInt.getValue() << std::endl;
}
int main()
{
MyInt myInt1 = 5; // Error: 不能隐式转换
MyInt myInt2(5); // 可以显式调用构造函数
printInt(5); // Error: 不能隐式转换
printInt(MyInt(5)); // 可以显式调用转换函数
return 0;
}
在这个例子中,MyInt
类定义了一个 explicit
构造函数 MyInt(int val)
。在 main()
函数中,我们尝试直接将整数值传递给 MyInt
类型的对象,以及尝试将整数值传递给接受 MyInt
类型对象的函数。在这两种情况下,如果没有使用 explicit
关键字,编译器会自动进行隐式类型转换,从而导致编译错误。而使用了 explicit
关键字后,必须显式地调用构造函数或者转换函数,以确保代码的清晰性和可读性。