// explicit關(guān)鍵字

    c++中的explicit關(guān)鍵字用來修飾類的構(gòu)造函數(shù),表明該構(gòu)造函數(shù)是顯式的,即拒絕構(gòu)造時的隱式轉(zhuǎn)換。如果c++類的構(gòu)造函數(shù)有一個參數(shù),那么在編譯的時候就會有一個缺省的轉(zhuǎn)換操作:將該構(gòu)造函數(shù)對應(yīng)數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為該類對象,如下面所示:

class MyClass
{
public:
    MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
    在上面的代碼中編譯器自動將整型轉(zhuǎn)換為MyClass類對象,實際上等同于下面的操作:
MyClass temp(10);
MyClass obj = temp;  
    上面的所有的操作即是所謂的"隱式轉(zhuǎn)換"。

    如果要避免這種自動轉(zhuǎn)換的功能,可以將類的構(gòu)造函數(shù)聲明為"顯示",也就是在聲明構(gòu)造函數(shù)的時候前面添加上explicit即可,這樣就可以防止這種自動的轉(zhuǎn)換操作,如果我們修改上面的MyClass類的構(gòu)造函數(shù)為顯示的,那么下面的代碼就不能夠編譯通過了,如下所示:
class MyClass
{
public:
    explicit MyClass( int num );
}
....
MyClass obj = 10; //err,can't non-explict convert
 
// 隱式類類型轉(zhuǎn)換
 
    這種效果一般都是通過類構(gòu)造函數(shù)實現(xiàn)的。那些可以用單個實參來調(diào)用的構(gòu)造函數(shù),定義了從形參類型到該類類型的一個隱式轉(zhuǎn)換。例如如下情況:
xxx(valueOfType1);//對于接受ClassType類型參數(shù)的函數(shù)xxx,參數(shù)傳遞中執(zhí)行了隱式轉(zhuǎn)換。
xxx(ClassType(valueOfType1));//與上面一句效果相同,只是顯示的使用了對應(yīng)的構(gòu)造函數(shù)。
    另外需要注意上面兩個語句中傳遞的類類型參數(shù)的生命周期僅限制在xxx函數(shù)中。
    如果需要抑制這種由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換,可以如上面所說將構(gòu)造函數(shù)聲明為explicit(且僅用于聲明)。
 
// 從類類型的轉(zhuǎn)換
    與隱式類類型轉(zhuǎn)換不同,前者是到類類型的轉(zhuǎn)換,而現(xiàn)在是利用轉(zhuǎn)換操作符,使給定類類型的對象轉(zhuǎn)換成為其他類型對象。這種轉(zhuǎn)換為什么有用呢?這種方法為了使類支持混合類型表達式,且可以減少類需要的支持功能的操作符數(shù)目。定義方法:通用形式為 operator type();
class A
{
public:
    A()
    {
        ……
    }
    operator B() const
    {
        return AtoB(A());
    }
    ……
};
    轉(zhuǎn)換函數(shù)一般不應(yīng)該改變被轉(zhuǎn)換的對象,因此轉(zhuǎn)換操作符通常應(yīng)該定義為const。
 
// Reference
    詳情請見《C++ Primer》4th Edi中的5.12、12.4、14.9,還有g(shù)oogle資源。