Bootstrap

C++ explicit关键字

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;这种用法了,表明该构造函数是显示的, 而非隐式的。

;