c++中的explicit關鍵字用來修飾類的構造函數,表明該構造函數是顯式的,既然有"顯式"那麼必然就有"隱式",那麼什麼是顯示而什麼又是隱式的呢?
如果c++類的構造函數有一個參數,那麼在編譯的時候就會有一個缺省的轉換操作:將該構造函數對應數據類型的數據轉換爲該類對象,如下面所示:
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
MyClass obj = temp;
如果要避免這種自動轉換的功能,我們該怎麼做呢?嘿嘿這就是關鍵字explicit的作用了,將類的構造函數聲明爲"顯示",也就是在聲明構造函數的時候前面添加上explicit即可,這樣就可以防止這種自動的轉換操作,如果我們修改上面的MyClass類的構造函數爲顯示的,那麼下面的代碼就不能夠編譯通過了,如下所示:
{
public:
explicit MyClass( int num );
}
....
MyClass obj = 10; //err,can't non-explict convert
explicit主要用於"修飾"構造函數.
使得它不用於程序中需要通過此構造函數進行"隱式"轉換的情況!
指定此關鍵字,需要隱式轉換方可進行的程序將會不能通過.
而可通過強制轉換使它沒有用.
explicit,和構造函數一起使用.
explicit constructor指明構造函數只能顯示使用,目的是爲了防止不必要的隱式轉化.
舉個例子:
有這樣一段代碼:
class A
{
public:
A(int);
private:
int num;
};
int Test(const A&) // 一個應用函數
{
...
}
Test(2); // 正確
過程是這樣的: 編譯器知道傳的值是int而函數需要的是A類型,但它也同時知道調用A的構造函數將int轉換成一個合適的A,所以纔有上面成功的調用.換句話說,編譯器處理這個調用時的情形類似下面這樣:
const A temp(2); // 從2產生一個臨時A對象
Test(temp); // 調用函數
如果代碼寫成如下樣子:
class A
{
public:
explicit A(int);
private:
int num;
};
int Test(const A&) // 一個應用函數
{
...
}
Test(2); // 失敗,不能通過隱式類型轉換將int類型變量構造成成A類型變量