1. 程式人生 > >C++:隱式型別轉換和關鍵字explicit

C++:隱式型別轉換和關鍵字explicit

《Inside the C++ Object Model》第二章開篇處有這樣一段話:“事實上關鍵字explicit之所以被匯入這個語言,就是為了給程式設計師提供一種方法,使他們能夠制止“單一引數的constructor”被當做一個conversion運算子”。

conversion運算子即型別轉換運算子,這是類的一種特殊成員函式,它負責將一個類型別的值轉換成其他型別,一般形式為:operator type() const,其中type表示被轉換成的某種型別。


隱式型別轉換

《C++primer》中講到了一個規定:“如果建構函式只接受一個實參,則它實際上定義了轉換為此類型別的隱式轉換機制”(關鍵字explicit出現的原因就是在C++這個規定的基礎上)。

class Test
{
 public:  
     Test(int num);
}
Test obj = 10;//編譯器自動將整型“隱式轉換”為Test類物件
//在這種情況下,該語句等同於Test temp(10);Test obj = temp;

隱式型別轉換中,編譯器只會自動地執行一步型別轉換(只允許一步類型別轉換)。


關鍵字explicit

我們可以通過將建構函式宣告為explicit從而抑制建構函式定義的隱式轉換。

class Test
{  
 public:
       explicit Test(int num);
}
Test obj = 10;//error!

Note:

需要注意的是,關鍵字explicit只對一個實參的建構函式有效,需要多個實參的建構函式不能用於執行隱式轉換,所以無需將這些建構函式指定為 explicit 的。

而且explicit只能在類內宣告建構函式時使用,在類外部定義時不應重複。

explicit建構函式只能用於直接初始化,不能用於拷貝形式的初始化過程。