C++ 語言可以定義如何將其他類型的對象隱式轉換為我們的類類型, 或將我們的類類型的對象隱式轉換為其他類型。
下面為類類型的隱式轉換的示例代碼:
#includeusing namespace std; class A { public: A(int temp) //普通構造函數 { a = temp; cout << 普通構造函數: a= << a << endl; } A(const A &temp) //拷貝構造函數 { a = temp.a; cout << 拷貝構造函數: a = << a << endl; } private: int a; }; int main() { cout << 顯示調用: << endl; A a(250); //顯式調用調用普通構造函數,ok A b(a); //顯式調用調用拷貝構造函數,ok cout << 隱式轉換: << endl; A c=222; //隱式轉換成調用普通構造函數,ok A d=c; //隱式轉換成調用拷貝構造函數,ok return 0; }
如果要避免這種自動轉換的功能,我們該怎麼做呢?C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。
c++中的explicit關鍵字抑制由構造函數定義的隱式轉換。explicit關鍵字只能用於類內部的構造函數聲明上。在類的定義體外部所做的定義上不要加explicit關鍵字。
示例代碼如下:
#includeusing namespace std; class A { public: explicit A(int temp) //普通構造函數,被聲明為explicit(顯式) { a = temp; cout << 普通構造函數: a= << a << endl; } explicit A(const A &temp) //拷貝構造函數,被聲明為explicit(顯式) { a = temp.a; cout << 拷貝構造函數: a = << a << endl; } private: int a; }; int main() { cout << 顯示調用: << endl; A a(250); //顯式調用調用普通構造函數,ok A b(a); //顯式調用調用拷貝構造函數,ok //explicit構造函數只能被顯式調用 A c=222; //不能通過隱式轉換,error A d=c; //不能通過隱式轉換,error return 0; }
普通構造函數能夠被隱式調用。而explicit構造函數只能被顯式調用。
通常,除非有明顯的理由想要定義隱式轉換,否則,單形參構造函數應該為 explicit。將構造函數設置為explicit可以避免錯誤,並且當轉換有用時,用戶可以顯式地構造對象。