C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。聲明為explicit的構造函數不能在隱式轉換中使用。
c++規定:對于可能只需傳一個參數的默認構造函數,都定義了一種隱式調用。
注意:只需傳一個參數不僅指的是只有一個參數的默認構造函數,也指那些包含了定義了參數默認值的那些默認構造函數。
舉例說明:
class MyClass{ public: MyClass(); MyClass(string s); MyClass(int i, int y = 0);}
這里的MyClass(string s)函數和MyClass(int i, int y = 0)函數都是可能只需傳一個參數的默認構造函數
看一下使用構造函數構造類對象的情況:
•MyClass obj1;//OK,調用了MyClass()
•MyClass obj2(string("Hello World!"));//OK,調用了MyClass(string s)
•MyClass obj3(12, 12);//OK,調用了MyClass(int i, int y = 0)
•MyClass obj4(12);//同上
•MyClass obj5 = 12;//同上。但是對于obj5,實際上等價于MyClass temp(12);MyClass obj5(temp);//也就是說默認調用了默認拷貝構造函數。這就是所謂的隱式調用。
大部分情況下,隱式調用都會產生bug,而且很難察覺?;诖耍珻++引入explict關鍵字關閉這種隱式調用,避免因為隱式調用而產生的bug。