关键字explicit的作用是将类的构造函数声明为”显式”,这解释他之前,我先解释下”隐式的概念”,先上一段代码。
class MyClass
{
public:
MyClass( int num );
}
//.
MyClass obj = 10; //ok,convert int to MyClass
在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;
这个操作的本质是因为cpp中 “=”操作符的默认声明导致,等号默认声明类似如下语句(具体记不住了)
MyClass operator=(MyClass)
因此 MyClass obj = 10就是 obj.operator=(10),根据函数参数的隐式转换原则,就会有MyClass temp(10)这一步。
上面所说的explicit关键字就是禁止使用该构造函数进行隐式转化,比如下面例子会编译报错。
class MyClass
{
public:
explicit MyClass( int num );
}
//.
MyClass obj = 10; //err,can't non-explict convert
explicit这个关键字,个人觉得它的作用是避免程序员犯一些函数调用混乱的问题,比如下面的例子
#include <iostream>
using namespace std;
class String {
public:
String ( char* p ){
cout << " invoke String(char*) " << endl;
};
String ( int n ){
cout << " invoke String(int) " << endl;
};
};
int main()
{
String s1 = 10; //编译通过, 调用String(int)
String s2 = 'a'; //编译通过,调用 String(int),因为char* x='a'是不符合cpp语法的,而 int x = 'a'是符合cpp语法的
String s3 = "a"; //编译通过,调用了String(char*)
}
s2和s3其实很相似,但根据隐式转换的原则,只要没有歧义就能完成转化,而这两个在编译器看来都不会有歧义,但对于程序员来说,是人的话,就有犯错的可能性,所以感觉explicit关键字的使用可以有效避免这类错误吧!(纯粹个人感觉,没有权威性)
主要参考文章:http://blog.csdn.net/c337134154/article/details/48794109