cpp中的explict与隐式转换

关键字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

猜你喜欢

转载自blog.csdn.net/yinglang19941010/article/details/52062776
今日推荐