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