C++ explicit用法

explicit关键字

explicit 作用

在 C++中, explicit 关键字用来修饰类的构造函数, 被修饰的构造函数的类, 不能发生相应的隐式类型转换, 只能以显式的方式进行类型转换.

explicit 使用注意事项:

  • explicit 关键字只能用于类内部的构造函数声明上;
  • explicit 关键字作用于单个参数的构造函数 (多个参数也适用, 但必须只有一个参数需要赋值, 其他的参数要有默认值).
  • 在 C++ 中, explicit 关键字用来修饰类的构造函数, 被修饰的构造函数的类, 不能发生相应的隐式类型转换.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{
public:
A(); // default构造函数
};

class B
{
public:
explicit B(int x = 0, bool b = true); // default构造函数
};

class C
{
public:
explicit C(int x); // 不是default构造函数
};

上述的classes B和C的构造函数都被声明为explicit,这可以组织它们被用来执行隐式类型转换,但它们仍然可以被用来进行显式类型转换:

1
2
3
4
5
6
7
8
9
void doSomething(B bObject);    // 函数,接受一个为B的对象

B bObj1; //一个类型为B的对象
doSomething(bObj1); // 没问题,传递一个B给doSomething对象
B bOBj2(28); // 没问题,根据int 28建立一个B

doSomething(28); // 错误!doSomething应该接受一个B,不是一个int,而int至B没有隐式转化

doSomething(B(28)); // 没问题,使用B构造函数将int显式转换为一个B以促成此调用

被声明为explicit二点构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往不被预期)的类型转换。除非我有一个好的理由允许构造函数被用于隐式转换,否则我会把它声明为explicit。


C++ explicit用法
https://gstarmin.github.io/2023/03/13/Cpp-explicit用法/
作者
Starmin
发布于
2023年3月13日
许可协议