在 C++ 中,explicit
关键字用于修饰构造函数或转换运算符,其主要作用是防止隐式类型转换和拷贝初始化
防止隐式类型转换
默认情况下,如果一个类的构造函数只有一个参数,编译器会使用它来进行隐式类型转换。例如:
class MyClass {
public:
MyClass(int value) : data(value) {} // 非 explicit 构造函数
private:
int data;
};
void print(MyClass obj) {
std::cout << obj.data << std::endl;
}
int main() {
print(42); // 隐式调用 MyClass(int) 构造函数
return 0;
}
在这个例子中,print(42)
会隐式地调用 MyClass(int)
构造函数,将 42
转换为 MyClass
类型的对象。
如果使用 explicit
修饰构造函数:
class MyClass {
public:
explicit MyClass(int value) : data(value) {} // explicit 构造函数
private:
int data;
};
此时,print(42)
将无法通过编译,因为 explicit
禁止了隐式类型转换。如果需要使用 MyClass
,必须显式地调用构造函数:
print(MyClass(42)); // 显式调用构造函数
防止拷贝初始化
explicit
也可以防止通过拷贝初始化的方式创建对象。例如:
MyClass obj = 42; // 拷贝初始化
如果构造函数是 explicit
的,这种拷贝初始化将被禁止,必须使用直接初始化:
MyClass obj(42); // 直接初始化