explicit用來防止由構造函數定義的隱式轉換。
隱式轉換:可以由單個實參來調用的構造函數定義了一個從形參類型到該類類型的隱式轉換。
例如:
Test類的構造函數就定義了一個從int類型到Test類型的隱式轉換。
編譯器在試圖編譯某一條語句時,如果某一函數的參數類型不匹配,編譯器就會嘗試進行隱式轉換,如果隱式轉換後能正確編譯,編譯器就會繼續執行編譯過程,否則報錯。
例如在上述代碼中的print(100)語句中,100是int類型的數據,而print函數的參數要求是Test類型的,類型不匹配,編譯器就會利用Test的構造函數進行隱式轉換,將100轉換為一個Test類型的實例,而後繼續編譯。
上述代碼最終能夠正確編譯,最終執行結構為:
而explicit關鍵字是阻止單參數構造函數的這種隱式轉換機制。
如果在上述的代碼中的Test構造函數前面加上explicit修飾的話,編譯就會出錯,如下:
由此可見,被聲明為explicit的構造函數禁止編譯器執行非預期的類型轉換。