C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).
那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:
#include<iostream>
class Entity
{
private:
std::string m_Name;
int m_Age;
public:
Entity(const std::string& name)
: m_Name(name), m_Age(-1) {}
Entity(int age)
: m_Name("Unknown"), m_Age(age) {}
};
void PrintEntity(const Entity& entity)
{
std::cout << "" << std::endl;
}
int main()
{
PrintEntity(22);
Entity b = 22;
std::cin.get();
}
PrintEntity(22)和Entity b = 22;编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。Entity b = 22此时等同于下面的操作:
Entity b(22);
但是这样就会显得很混乱,降低可读性,有什么办法阻止这种用法呢? 答案就是使用explicit关键字。我们把Entity(int age)前加上explicit关键字,就不能使用Entity b = 22;这种用法了,表明该构造函数是显示的, 而非隐式的。