explicit 关键字
时间: 2023-07-18 21:40:08 浏览: 42
在 C++ 中,explicit 是一个关键字,用于修饰构造函数,它的作用是禁止隐式转换。如果一个构造函数被声明为 explicit,那么它就不能在隐式转换中使用,只能用于显式地创建对象。这样可以避免一些不必要的类型转换,提高程序的安全性和可读性。例如:
```c++
class A {
public:
explicit A(int x) { ... }
};
void func(A a) { ... }
int main() {
A obj(1); // 正确,显式调用构造函数
A obj2 = 2; // 错误,不能进行隐式转换
func(3); // 错误,不能进行隐式转换
func(A(3)); // 正确,显式调用构造函数
return 0;
}
```
相关问题
explicit关键字
explicit关键字是C++中的一种修饰符,用于显式地声明构造函数或转换函数,以防止隐式类型转换。
在类中,如果一个构造函数或转换函数被explicit关键字修饰,那么它不能被用于隐式类型转换。也就是说,只能通过显式的方式调用该函数来进行类型转换。
例如,下面的代码中,构造函数和转换函数都被用explicit修饰,因此在进行类型转换时必须显式地调用它们:
```cpp
class A {
public:
explicit A(int x) {}
explicit operator int() const { return 0; }
};
int main() {
A a(10);
int x = static_cast<int>(a); // 显式调用转换函数
int y = static_cast<int>(A(20)); // 显式调用构造函数
int z = a; // 错误,不能进行隐式类型转换
return 0;
}
```
在上面的代码中,第三行出现了编译错误,因为a不能被隐式地转换为int类型。必须使用static_cast等显式类型转换函数来进行转换。
explicit 关键字作用
在 C++ 中,explicit 关键字用于修饰构造函数,表示该构造函数不可被隐式调用。也就是说,如果一个构造函数被标记为 explicit,那么在使用该构造函数创建对象时,必须显式地调用该构造函数。
例如,假设有一个类 A,其中有一个带有一个参数的构造函数:
```c++
class A {
public:
A(int x) { }
};
```
如果不加 explicit 关键字,那么可以通过以下方式隐式地调用构造函数创建对象:
```c++
A a = 123; // 隐式调用构造函数
```
但如果将构造函数标记为 explicit,则必须显式地调用构造函数创建对象:
```c++
A a(123); // 显式调用构造函数
```
这样可以避免一些意外的类型转换,提高代码的安全性和可读性。