0%

C++中的explicit关键字

C++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,explicit构造函数是用来防止隐式转换的。

隐式转换:

如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。
如下面所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A
{
public:
A(int data) : m_data(data)
{

}

~A(){}

void ShowInfo()
{
PRINT_INFO("m_data = " << m_data);
}

private:
int m_data;
};

A a = 10; //隐式转换,可以编译通过,convert int to A
a.ShowInfo();

在上面的代码中编译器自动将整型转换为A类对象,实际上等同于下面的操作:

1
A a(10);

上面的所有的操作即是所谓的"隐式转换"

输出结果:

[INFO]: m_data = 10

如果上述class A的构造函数声明为explicit的,则不能通过隐式转换来调用这个构造函数:

1
2
3
4
explicit A(int data) : m_data(data)
{

}

则上述代码无法通过编译:

1
//A a = 10;//error: conversion from ‘int’ to non-scalar type ‘A’ requested A a = 10;

可通过显式调用:

1
A a(10); //显式调用

普通构造函数能够被隐式调用,而explicit构造函数只能被显式调用。