explicit关键字

explicit的作用

在C++中explicit用来修饰类的构造函数,用于禁止隐式类型转换(只能显式调用构造函数)和禁止复制初始化(只能直接使用初始化)。

explicit使用的注意事项

  • explicit只能用于类内部的构造函数声明上。
  • explicit关键字作用于单个参数的构造函数。

禁止隐式类型转换的示例

未加explicit时的隐式类型转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;

class Point {
public:
int x, y;
Point(int x = 0, int y = 0)
: x(x), y(y) {}
};

void displayPoint(const Point& p)
{
cout << "(" << p.x << ","
<< p.y << ")" << endl;
}

int main()
{
displayPoint(1);
Point p = 1;
}

上面示例中的Point类定义了一个使用默认参数的构造函数,因此主函数中两行代码均会触发该构造函数的隐式调用(如果构造函数不使用默认参数,会在编译时报错)。

然而,displayPoint需要的是Point类型的参数,而传入的是一个int,隐式调用导致该程序能够运行成功。explicit关键字就是用来处理这样的情况,避免意外发生。
加上explicit的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

class Point {
public:
int x, y;
explicit Point(int x = 0, int y = 0)
: x(x), y(y) {}
};

void displayPoint(const Point& p)
{
cout << "(" << p.x << ","
<< p.y << ")" << endl;
}

int main()
{
displayPoint(Point(1));
// displayPoint(1); // 错误:explicit禁止隐式类型转换
Point p(1);
}

加上explicit后,displayPoint函数中就被禁止进行隐式转换,必须传入Point类型的实参。

禁止复制初始化示例

1
2
3
4
5
6
7
8
9
10
11
12

#include <iostream>

class Baz {
public:
explicit Baz(int) {}
};

int main() {
Baz b1(42); // ✅ 直接初始化
// Baz b2 = 42; // ❌ 错误:explicit 禁止复制初始化
}

explicit关键字
https://delta0406.github.io/2025/09/24/技术/语言/CPP/explicit关键字/
作者
执妄
发布于
2025年9月24日
许可协议