C++ 只有explicit關鍵字,沒有implicit關鍵字。編譯器允許解析函數的參數時,對參數作隱式轉換。也就是說,編譯器能夠使用帶單個參數的構造函數,將函數參數轉換為正確的類型。
帶有單個形參的構造函數定義了一種由實參類型到類類型的隱式轉換。
下面的類帶有可用於隱式轉換的構造函數:
DoBar的形參為Foo
對象,現在卻傳了一個int
給它,然而,Foo
類存在一個帶有 int
類型的構造函數,所以編譯器就用這個構造函數將參數隱式轉換為 Foo
對象類型。
如果在構造函數前面加 explicit
關鍵字,就能阻止編譯器使用這個構造函數做隱式轉換,而是必須明確地寫出:DoBar (Foo (42))
由於無意中的隱式轉換會隱藏bug, 這就是構造函數前面加 explicit
的原因。
上面的例子,本意是要寫成print("3"),但是不小心寫成了 print(3), 編譯器自行隱式使用構造函數 MyString(3), 將臨時對象傳遞給print,輸出“xxx”,但是如果在構造函數 MyString(int size) 前加“explicit", 寫成print(3) 編譯時就會報錯,顯式寫成 print(Mystring(3))就不會。
再如:
由於same_isbn 函數要求傳入 Sales_item 對象的參數,現在傳入的是string,於是編譯器自動使用帶string參數的構造函數隱式轉換,生成一個Sales_item臨時對象,傳給same_isbn函數。代碼雖然能執行,但也可能是用戶寫錯了。
一個使用了explicit關鍵字的類:
閱讀更多 晨夕Sama 的文章